Книга: UNIX: взаимодействие процессов

Именованные семафоры 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 usecn", Stop_time());
35  if (shared.counter != nloop * nthreads)
36   printf("error: counter = %ldn", shared.counter);
37  Sem_unlink(Px_ipc_name(NAME));
38  exit(0);
39 }

Оглавление книги


Генерация: 1.357. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз