Листинг А.19. Глобальные переменные и функция main для взаимных исключений Posix
//bench/incr_pxmutex1.с
1 #include "unpipc.h"
2 #define MAXNTHREADS 100
3 int nloop;
4 struct {
5 pthread_mutex_t mutex;
6 long counter;
7 } shared = {
8 PTHREAD_MUTEX_INITIALIZER
9 };
10 void *incr(void *);
11 int
12 main(int argc, char **argv)
13 {
14 int i, nthreads;
15 pthread_t tid[MAXNTHREADS];
16 if (argc != 3)
17 err_quit("usage: incr_pxmutex1 <#loops> <#threads>");
18 nloop = atoi(argv[1]);
19 nthreads = min(atoi(argv[2]), MAXNTHREADS);
20 /* блокировка взаимного исключения */
21 Pthread_mutex_lock(&shared.mutex);
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 Pthread_mutex_unlock(&shared.mutex);
30 /* ожидание завершения работы потоков */
31 for (i = 0; i < nthreads; i++) {
32 Pthread_join(tid[i], NULL);
33 }
34 printf("microseconds: %.0f usec\n", Stop_time());
35 if (shared.counter != nloop * nthreads)
36 printf("error: counter = %ld\n", shared, counter);
37 exit(0);
38 }