Именованные семафоры 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 }
Данный текст является ознакомительным фрагментом.