/* -*- mode:c; c-file-style:"k&r"; c-basic-offset: 4; tab-width:4; indent-tabs-mode:nil; mode:auto-fill; fill-column:78; -*- */ /* vim: set ts=4 sw=4 et tw=78 fo=cqt wm=0: */ #include #include #include pthread_mutex_t count_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t condvar = PTHREAD_COND_INITIALIZER; void * function1(); void * function2(); int count = 0; #define COUNT_DONE 10 #define COUNT_HALT1 3 #define COUNT_HALT2 6 int main (int argc, const char ** argv) { pthread_t thread1, thread2; pthread_create(&thread1, NULL, &function1, NULL); pthread_create(&thread2, NULL, &function2, NULL); pthread_join(thread1, NULL); pthread_join(thread2, NULL); printf("Final count: %d\n", count); return 0; } void * function1 (void) { for(;;) { // Lock mutex and then wait for signal to relase mutex pthread_mutex_lock(&count_mutex); // Wait while functionCount2() operates on count // mutex unlocked if condition varialbe in functionCount2() signaled. pthread_cond_wait(&condvar, &count_mutex); count++; printf("Counter value in function1: %d\n", count); pthread_mutex_unlock(&count_mutex); if (count >= COUNT_DONE) return NULL; } } void * function2 (void) { for(;;) { pthread_mutex_lock(&count_mutex); if (count < COUNT_HALT1 || count > COUNT_HALT2) { // Condition of if statement has been met. // Signal to free waiting thread by freeing the mutex. // Note: functionCount1() is now permitted to modify "count". pthread_cond_signal(&condvar); } else { count++; printf("Counter value function2: %d\n", count); } pthread_mutex_unlock(&count_mutex); if (count >= COUNT_DONE) return NULL; } }