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

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

Шрифт:

31 }

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

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

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

35 exit(0);

36 }

18-19 Создается семафор, инициализируемый значением 0. Второй аргумент в вызове sem_init, имеющий значение 0, говорит о том, что семафор используется только потоками вызвавшего процесса.

20-27 После создания всех потоков запускается таймер и вызывается функция sem_post.

Именованные семафоры Posix

В листинге А.26 приведен текст функции main, измеряющей быстродействие именованных семафоров Posix, а в листинге А.25 — соответствующая функция incr.

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

//bench/incr_pxsem2.c

40 void *

41 incr(void *arg)

42 {

43 int i;

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

45 Sem_wait(shared.mutex);

46 shared.counter++;

47 Sem_post(shared.mutex);

48 }

49 return(NULL);

50 }

Листинг А.26. Функция main для измерения быстродействия именованных семафоров Posix

//bench/incr_pxsem2.с

1 #include "unpipc.h"

2 #define MAXNTHREADS 100

3 #define NAME "incr_pxsem2"

4 int nloop;

5 struct {

6 sem_t *mutex; /* указатель на именованный семафор */

7 long counter;

8 } shared;

9 void *incr(void *);

10 int

11 main(int argc, char **argv)

12 {

13 int i, nthreads;

14 pthread_t tid[MAXNTHREADS];

15 if (argc != 3)

16 err_quit("usage: incr_pxsem2 <#loops> <#threads>");

17 nloop = atoi(argv[1]);

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

19 /* инициализация именованного семафора 0 */

20 sem_unlink(Px_ipc_name(NAME)); /* ошибка – OK */

21 shared.mutex = Sem_open(Px_ipc_name(NAME), O_CREAT | O_EXCL, FILE_MODE, 0);

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

23 Set_concurrency(nthreads);

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

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

26 }

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

28 Start_time;

29 Sem_post(shared.mutex);

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

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

32 Pthread_join(tid[i], NULL);

33 }

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

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

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

37 Sem_unlink(Px_ipc_name(NAME));

38 exit(0);

39 }

Семафоры System V

Функция main программы, измеряющей быстродействие семафоров System V, приведена в листинге А.27, а функция incr показана в листинге А.28.

Листинг А.27. Функция main для измерения быстродействия семафоров System V

//bench/incr_svsem1.c

1 #include "unpipc.h"

2 #define MAXNTHREADS 100

3 int nloop;

4 struct {

5 int semid;

6 long counter;

7 } shared;

8 struct sembuf postop, waitop;

9 void *incr(void *);

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

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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