8 static pthread_cond_t cond1
= PTHREAD_COND_INITIALIZER
;
9 static pthread_mutex_t mut1
= PTHREAD_MUTEX_INITIALIZER
;
11 static pthread_cond_t cond2
= PTHREAD_COND_INITIALIZER
;
12 static pthread_mutex_t mut2
= PTHREAD_MUTEX_INITIALIZER
;
14 static bool last_round
;
22 pthread_mutex_lock (&mut1
);
28 pthread_mutex_lock (&mut2
);
30 pthread_cond_signal (&cond2
);
31 pthread_mutex_unlock (&mut2
);
34 pthread_cond_wait (&cond1
, &mut1
);
38 pthread_mutex_unlock (&mut1
);
45 main (int argc
, char *argv
[])
51 bool keeplock
= false;
53 while ((opt
= getopt (argc
, argv
, "n:r:k")) != -1)
57 nthreads
= atol (optarg
);
60 nrounds
= atol (optarg
);
69 pthread_t th
[nthreads
];
71 for (i
= 0; i
< nthreads
; ++i
)
72 if (__builtin_expect ((err
= pthread_create (&th
[i
], NULL
, cons
, (void *) (long) i
)) != 0, 0))
73 printf ("pthread_create: %s\n", strerror (err
));
75 for (i
= 0; i
< nrounds
; ++i
)
77 pthread_mutex_lock (&mut2
);
79 pthread_cond_wait (&cond2
, &mut2
);
80 pthread_mutex_unlock (&mut2
);
82 pthread_mutex_lock (&mut1
);
84 pthread_mutex_unlock (&mut1
);
91 pthread_cond_broadcast (&cond1
);
94 pthread_mutex_unlock (&mut1
);
97 for (i
= 0; i
< nthreads
; ++i
)
98 if ((err
= pthread_join (th
[i
], NULL
)) != 0)
99 printf ("pthread_create: %s\n", strerror (err
));