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

Именованные семафоры 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 ", Stop_time());

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

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

37  Sem_unlink(Px_ipc_name(NAME));

38  exit(0);

39 }

Данный текст является ознакомительным фрагментом.