#include<pthread.h>
#include<stdio.h>
int signal;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void consumer()
{
pthread_mutex_lock(&mutex);
if(signal==0)
{
printf("It is not my turn let me sleep\n"); pthread_cond_wait(&cond,&mutex);
printf("I got signal to do the work\n"); }
pthread_mutex_unlock(&mutex);
}
void producer()
{
pthread_mutex_lock(&mutex);
signal=1;
if(signal==1)
{
pthread_cond_signal(&cond);
}
pthread_mutex_unlock(&mutex);
}
int main()
{
pthread_t t1, t2;
int status1, status2;
status1=pthread_create(&t1, NULL, (void*)consumer, NULL);
status2=pthread_create(&t2, NULL, (void*)producer, NULL);
pthread_join (t1,NULL);
pthread_join (t2, NULL);
return 0;
}
I2luY2x1ZGU8cHRocmVhZC5oPgojaW5jbHVkZTxzdGRpby5oPgppbnQgc2lnbmFsOwpwdGhyZWFkX2NvbmRfdCBjb25kID0gUFRIUkVBRF9DT05EX0lOSVRJQUxJWkVSOwpwdGhyZWFkX211dGV4X3QgbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwp2b2lkIGNvbnN1bWVyKCkKewoJcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCk7CglpZihzaWduYWw9PTApCgl7CgkJcHJpbnRmKCJJdCBpcyBub3QgbXkgdHVybiBsZXQgbWUgc2xlZXBcbiIpOwoJCXB0aHJlYWRfY29uZF93YWl0KCZjb25kLCZtdXRleCk7CgkJcHJpbnRmKCJJIGdvdCBzaWduYWwgdG8gZG8gdGhlIHdvcmtcbiIpOwoJfQoJcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKfQp2b2lkIHByb2R1Y2VyKCkKewoJcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCk7CglwcmludGYoIlJlc291cmNlcyBsb2NrZWRcbiIpOwoJc2lnbmFsPTE7CglpZihzaWduYWw9PTEpCgl7CgkJcHRocmVhZF9jb25kX3NpZ25hbCgmY29uZCk7Cgl9CglwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOwp9CgppbnQgbWFpbigpCnsKCXB0aHJlYWRfdCB0MSwgdDI7CglpbnQgc3RhdHVzMSwgc3RhdHVzMjsKCXN0YXR1czE9cHRocmVhZF9jcmVhdGUoJnQxLCBOVUxMLCAodm9pZCopY29uc3VtZXIsIE5VTEwpOwoJc3RhdHVzMj1wdGhyZWFkX2NyZWF0ZSgmdDIsIE5VTEwsICh2b2lkKilwcm9kdWNlciwgTlVMTCk7CglwdGhyZWFkX2pvaW4gKHQxLE5VTEwpOwoJcHRocmVhZF9qb2luICh0MiwgTlVMTCk7CglyZXR1cm4gMDsKfQ==