Вход/Регистрация
UNIX: взаимодействие процессов
вернуться

Стивенс Уильям Ричард

Шрифт:

18 err_quit("usage: incr_rwlockl <#loops> <#threads>");

19 nloop = atoi(argv[1]);

20 nthreads = min(atoi(argv[2]), MAXNTHREADS);

21 /* получение блокировки на запись */

22 Rw_wrlock(&shared.rwlock);

23 /* создание всех потоков */

24 Set_concurrency(nthreads);

25 for (i = 0; i < nthreads; i++) {

26 Pthread_create(&tid[i], NULL, incr, NULL);

27 }

28 /* запуск таймера и снятие блокировки */

29 Start_time;

30 Rw_unlock(&shared.rwlock);

31 /* ожидание завершения всех потоков */

32 for (i = 0; i < nthreads; i++) {

33 Pthread_join(tid[i], NULL);

34 }

35 printf("microseconds: %.0f usec\n", Stop_time);

36 if (shared.counter != nloop * nthreads)

37 printf("error: counter = %ld\n", shared.counter);

38 exit(0);

39 }

Листинг А.22. Увеличение общего счетчика с использованием блокировок чтения-записи

//bench/incr_rwlock1.c

40 void *

41 incr(void *arg)

42 {

43 int i;

44 for (i = 0; i < nloop; i++) {

45 Rw_wrlock(&shared.rwlock);

46 shared.counter++;

47 Rw_unlock(&shared.rwlock);

48 }

49 return(NULL);

50 }

Семафоры Posix, размещаемые в памяти

Мы измеряем скорость работы семафоров Posix (именованных и размещаемых в памяти). В листинге А.24 приведен текст функции main, а в листинге А.23 — текст функции incr.

Листинг А.23. Увеличение счетчика с использованием семафоров Posix в памяти

//bench/incr_pxsem1.с

37 void *

38 incr(void *arg)

39 {

40 int i;

41 for (i = 0; i < nloop; i++) {

42 Sem_wait(&shared.mutex);

43 shared.counter++;

44 Sem_post(&shared.mutex);

45 }

46 return(NULL);

47 }

Листинг А.24. Функция main для семафоров Posix, размещаемых в памяти

//bench/incr_pxsem1.с

1 #include "unpipc.h"

2 #define MAXNTHREADS 100

3 int nloop;

4 struct {

5 sem_t mutex; /* размещаемый в памяти семафор */

6 long counter;

7 } shared;

8 void *incr(void *);

9 int

10 main(int argc, char **argv)

11 {

12 int i, nthreads;

13 pthread_t tid[MAXNTHREADS];

14 if (argc != 3)

15 err_quit("usage: incr_pxseml <#loops> <#threads>");

16 nloop = atoi(argv[1]);

17 nthreads = min(atoi(argv[2]), MAXNTHREADS);

18 /* инициализация размещаемого в памяти семафора 0 */

19 Sem_init(&shared.mutex, 0, 0);

20 /* создание всех потоков */

21 Set_concurrency(nthreads);

22 for (i = 0; i < nthreads; i++) {

23 Pthread_create(&tid[i], NULL, incr, NULL);

24 }

25 /* запуск таймера и разблокирование семафора */

26 Start_time;

27 Sem_post(&shared.mutex);

28 /* ожидание завершения всех потоков */

29 for (i = 0; i < nthreads; i++) {

30 Pthread_join(tid[i], NULL);

  • Читать дальше
  • 1
  • ...
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: