#include #include #include pthread_mutex_t count_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t condition_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t condition_cond = PTHREAD_COND_INITIALIZER; void *functionCountOdd(); void *functionCountEven(); void *functionCount(); int count = 0; #define COUNT_DONE 10 void main(){ pthread_t thread1, thread2, thread3; pthread_create( &thread1, NULL, &functionCountOdd, NULL); pthread_create( &thread2, NULL, &functionCountEven, NULL); //pthread_create( &thread3, NULL, &functionCount, NULL); pthread_join( thread1, NULL); pthread_join( thread2, NULL); //pthread_join( thread3, NULL); } void *functionCount(){ while(1){ pthread_mutex_lock( &count_mutex ); count++; printf("CountAll : %d\n",count); pthread_mutex_unlock( &count_mutex ); if(count >= COUNT_DONE) return(NULL); } } void *functionCountOdd(){ while(1){ pthread_mutex_lock( &condition_mutex ); while( (count%2)==0 ) { pthread_cond_wait( &condition_cond, &condition_mutex ); } pthread_mutex_unlock( &condition_mutex ); pthread_mutex_lock( &count_mutex ); count++; printf("CountOdd : %d\n",count); pthread_mutex_unlock( &count_mutex ); if(count >= COUNT_DONE) return(NULL); } } void *functionCountEven(){ while(1) { pthread_mutex_lock( &condition_mutex ); while( (count%2)==1 ) { pthread_cond_signal( &condition_cond ); } pthread_mutex_unlock( &condition_mutex ); pthread_mutex_lock( &count_mutex ); count++; printf("CountEven: %d\n",count); pthread_mutex_unlock( &count_mutex ); if(count >= COUNT_DONE) return(NULL); } }