16 pthread_t tid[MAXNTHREADS];
17 if (argc != 3)
18 err_quit("usage: incr_rwlockl <#loops> <#threads>");
19 nloop = atoi(argv[1]);
20 nthreads = min(atoi(argv[2]), MAXNTHREADS);
21 /* получение блокировки на запись */
22 Rw_wrlock(&shared.rwlock);
23 /* создание всех потоков */
24 Set_concurrency(nthreads);
25 for (i = 0; i < nthreads; i++) {
26 Pthread_create(&tid[i], NULL, incr, NULL);
27 }
28 /* запуск таймера и снятие блокировки */
29 Start_time();
30 Rw_unlock(&shared.rwlock);
31 /* ожидание завершения всех потоков */
32 for (i = 0; i < nthreads; i++) {
33 Pthread_join(tid[i], NULL);
34 }
35 printf("microseconds: %.0f usec\n", Stop_time());
36 if (shared.counter != nloop * nthreads)
37 printf("error: counter = %ld\n", shared.counter);
38 exit(0);
39 }
//bench/incr_rwlock1.c
40 void *
41 incr(void *arg)
42 {
43 int i;
44 for (i = 0; i < nloop; i++) {
45 Rw_wrlock(&shared.rwlock);
46 shared.counter++;
47 Rw_unlock(&shared.rwlock);
48 }
49 return(NULL);
50 }
Семафоры Posix, размещаемые в памяти
Мы измеряем скорость работы семафоров Posix (именованных и размещаемых в памяти). В листинге А.24 приведен текст функции main, а в листинге А.23 — текст функции incr.
//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 }
//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\n", Stop_time());
33 if (shared.counter != nloop * nthreads)
34 printf("error: counter = %ld\n", shared.counter);
35 exit(0);
36 }