Home | History | Annotate | Download | only in tests
      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 
     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 
     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
     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