• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /********************************************************
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  *
12  * Demonstrates pthread condvars.
13  *
14  */
15 #include <unistd.h>
16 #include <stdio.h>
17 #include <pthread.h>
18 
19 #define NUM_THREADS  3
20 #define TCOUNT 10
21 #define COUNT_THRES 12
22 
23 int     condvar_was_hit = 0;
24 int     count = 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;
28 
inc_count(void * null)29 void *inc_count(void *null)
30 {
31   int i=0;
32 
33   for (i=0; i<TCOUNT; i++) {
34     pthread_mutex_lock(&count_lock);
35     count++;
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);
40     }
41     pthread_mutex_unlock(&count_lock);
42   }
43 
44   return(NULL);
45 }
46 
watch_count(void * null)47 void *watch_count(void *null)
48 {
49   pthread_mutex_lock(&count_lock);
50 
51   while (count < COUNT_THRES) {
52     pthread_cond_wait(&count_hit_threshold, &count_lock);
53     condvar_was_hit = 1;
54   }
55 
56   pthread_mutex_unlock(&count_lock);
57 
58   return(NULL);
59 }
60 
61 extern int
main(void)62 main(void)
63 {
64   int       i;
65   pthread_t threads[3];
66 
67   pthread_create(&threads[0], NULL, watch_count, NULL);
68   sleep(1);
69   pthread_create(&threads[1], NULL, inc_count,   NULL);
70   pthread_create(&threads[2], NULL, inc_count,   NULL);
71 
72   for (i = 0; i < NUM_THREADS; i++) {
73     pthread_join(threads[i], NULL);
74   }
75 
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");
86   else
87     printf("condvar was missed...\n");
88 
89   return 0;
90 }
91 
92 
93