Семафоры Posix, размещаемые в памяти
Семафоры 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);
31 }
32 printf("microseconds: %.0f usec ", Stop_time());
33 if (shared.counter != nloop * nthreads)
34 printf("error: counter = %ld ", shared.counter);
35 exit(0);
36 }
18-19 Создается семафор, инициализируемый значением 0. Второй аргумент в вызове sem_init, имеющий значение 0, говорит о том, что семафор используется только потоками вызвавшего процесса.
20-27 После создания всех потоков запускается таймер и вызывается функция sem_post.
Данный текст является ознакомительным фрагментом.