1 /********************************************************
2 * An example source module to accompany...
4 * "Using POSIX Threads: Programming with Pthreads"
5 * by Brad nichols, Dick Buttlar, Jackie Farrell
6 * O'Reilly & Associates, Inc.
8 ********************************************************
12 * Demonstrates pthread condvars.
21 #define COUNT_THRES 12
23 int condvar_was_hit
= 0;
25 int thread_ids
[3] = {0,1,2};
26 pthread_mutex_t count_lock
=PTHREAD_MUTEX_INITIALIZER
;
27 pthread_cond_t count_hit_threshold
=PTHREAD_COND_INITIALIZER
;
29 void *inc_count(void *null
)
33 for (i
=0; i
<TCOUNT
; i
++) {
34 pthread_mutex_lock(&count_lock
);
36 printf("inc_counter(): count = %d, unlocking mutex\n", count
);
37 if (count
== COUNT_THRES
) {
38 printf("hit threshold!\n");
39 pthread_cond_signal(&count_hit_threshold
);
41 pthread_mutex_unlock(&count_lock
);
47 void *watch_count(void *null
)
49 pthread_mutex_lock(&count_lock
);
51 while (count
< COUNT_THRES
) {
52 pthread_cond_wait(&count_hit_threshold
, &count_lock
);
56 pthread_mutex_unlock(&count_lock
);
67 pthread_create(&threads
[0], NULL
, watch_count
, NULL
);
69 pthread_create(&threads
[1], NULL
, inc_count
, NULL
);
70 pthread_create(&threads
[2], NULL
, inc_count
, NULL
);
72 for (i
= 0; i
< NUM_THREADS
; i
++) {
73 pthread_join(threads
[i
], NULL
);
76 // Nb: it's not certain that we'll hit here. It's possible that the two
77 // inc_count threads could fully run before watch_count begins, and so
78 // pthread_cond_wait() is never called. Or, we could get a spurious
79 // wake-up in watch_count(). Nonetheless, it's very likely that things
80 // will work out as expected, since we're starting watch_count() first.
81 // (Also since the sleep() call was added after watch_count()!)
82 if (condvar_was_hit
== 1)
83 printf("condvar was hit!\n");
84 else if (condvar_was_hit
> 1)
85 printf("condvar was multi-hit...\n");
87 printf("condvar was missed...\n");