blob: f525e3623b17603240eb7fd806b7ba2def7d942f [file] [log] [blame]
sewardj3b5d8862002-04-20 13:53:23 +00001/********************************************************
2 * An example source module to accompany...
3 *
4 * "Using POSIX Threads: Programming with Pthreads"
5 * by Brad nichols, Dick Buttlar, Jackie Farrell
6 * O'Reilly & Associates, Inc.
7 *
8 ********************************************************
9 *
10 * cvsimple.c
11 *
nethercoteab594782004-11-09 14:58:02 +000012 * Demonstrates pthread condvars.
sewardj3b5d8862002-04-20 13:53:23 +000013 *
14 */
15
16#include <stdio.h>
17#include <pthread.h>
18
19#define NUM_THREADS 3
20#define TCOUNT 10
21#define COUNT_THRES 12
22
nethercoteab594782004-11-09 14:58:02 +000023int condvar_was_hit = 0;
sewardj3b5d8862002-04-20 13:53:23 +000024int count = 0;
25int thread_ids[3] = {0,1,2};
26pthread_mutex_t count_lock=PTHREAD_MUTEX_INITIALIZER;
27pthread_cond_t count_hit_threshold=PTHREAD_COND_INITIALIZER;
28
nethercoteab594782004-11-09 14:58:02 +000029void *inc_count(void *null)
sewardj3b5d8862002-04-20 13:53:23 +000030{
njn25e49d8e72002-09-23 09:36:25 +000031 int i=0;
sewardj3b5d8862002-04-20 13:53:23 +000032
33 for (i=0; i<TCOUNT; i++) {
34 pthread_mutex_lock(&count_lock);
35 count++;
nethercoteab594782004-11-09 14:58:02 +000036 printf("inc_counter(): count = %d, unlocking mutex\n", count);
sewardj3b5d8862002-04-20 13:53:23 +000037 if (count == COUNT_THRES) {
nethercoteab594782004-11-09 14:58:02 +000038 printf("hit threshold!\n");
sewardj3b5d8862002-04-20 13:53:23 +000039 pthread_cond_signal(&count_hit_threshold);
40 }
41 pthread_mutex_unlock(&count_lock);
42 }
43
44 return(NULL);
45}
46
nethercoteab594782004-11-09 14:58:02 +000047void *watch_count(void *null)
sewardj3b5d8862002-04-20 13:53:23 +000048{
sewardj3b5d8862002-04-20 13:53:23 +000049 pthread_mutex_lock(&count_lock);
50
51 while (count < COUNT_THRES) {
52 pthread_cond_wait(&count_hit_threshold, &count_lock);
nethercoteab594782004-11-09 14:58:02 +000053 condvar_was_hit = 1;
sewardj3b5d8862002-04-20 13:53:23 +000054 }
55
56 pthread_mutex_unlock(&count_lock);
57
58 return(NULL);
59}
60
61extern int
62main(void)
63{
64 int i;
65 pthread_t threads[3];
66
nethercoteab594782004-11-09 14:58:02 +000067 pthread_create(&threads[0], NULL, watch_count, NULL);
68 pthread_create(&threads[1], NULL, inc_count, NULL);
69 pthread_create(&threads[2], NULL, inc_count, NULL);
sewardj3b5d8862002-04-20 13:53:23 +000070
71 for (i = 0; i < NUM_THREADS; i++) {
72 pthread_join(threads[i], NULL);
73 }
74
nethercoteab594782004-11-09 14:58:02 +000075 // Nb: it's not certain that we'll hit here. It's possible that the two
76 // inc_count threads could fully run before watch_count begins, and so
77 // pthread_cond_wait() is never called. Or, we could get a spurious
78 // wake-up in watch_count(). Nonetheless, it's very likely that things
79 // will work out as expected, since we're starting watch_count() first.
80 if (condvar_was_hit == 1)
81 printf("condvar was hit!\n");
82 else if (condvar_was_hit > 1)
83 printf("condvar was multi-hit...\n");
84 else
85 printf("condvar was missed...\n");
86
sewardj3b5d8862002-04-20 13:53:23 +000087 return 0;
88}
89
90