#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <time.h>
#define N 5
int stack[ N] ;
int top = - 1 ;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t full = PTHREAD_COND_INITIALIZER;
pthread_cond_t empty = PTHREAD_COND_INITIALIZER;
int c = 0 ;
void * producer( void * arg) ;
void * consumer( void * arg) ;
int main( )
{
pthread_t producer_thread, consumer_thread;
pthread_create( & producer_thread, NULL, producer, NULL) ;
pthread_create( & consumer_thread, NULL, consumer, NULL) ;
pthread_join( producer_thread, NULL) ;
pthread_join( consumer_thread, NULL) ;
return 0 ;
}
void * producer( void * arg)
{
while ( 1 )
{
pthread_mutex_lock( & mutex) ;
if ( c == 2 * N)
{
pthread_mutex_unlock( & mutex) ;
break ;
}
int num
= rand ( ) % 100 + 1 ; if ( num % 2 != 0 )
{
while ( top == N - 1 )
{
pthread_cond_wait( & full, & mutex) ;
}
top++;
stack[ top] = num;
printf ( "Producer added %d to the stack\n " , num
) ; pthread_cond_signal( & empty) ;
c++;
}
pthread_mutex_unlock( & mutex) ;
sleep( 1 ) ;
}
return NULL;
}
void * consumer( void * arg)
{
while ( 1 )
{
pthread_mutex_lock( & mutex) ;
if ( c == 2 * N)
{
pthread_mutex_unlock( & mutex) ;
break ;
}
int num
= rand ( ) % 100 + 1 ; if ( num % 2 == 0 )
{
while ( top == - 1 )
{
pthread_cond_wait( & empty, & mutex) ;
}
int item = stack[ top] ;
top--;
printf ( "Consumer removed %d from the stack\n " , item
) ; pthread_cond_signal( & full) ;
c++;
}
pthread_mutex_unlock( & mutex) ;
sleep( 1 ) ;
}
return NULL;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHB0aHJlYWQuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8dGltZS5oPgojZGVmaW5lIE4gNQppbnQgc3RhY2tbTl07CmludCB0b3AgPSAtMTsKcHRocmVhZF9tdXRleF90IG11dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKcHRocmVhZF9jb25kX3QgZnVsbCA9IFBUSFJFQURfQ09ORF9JTklUSUFMSVpFUjsKcHRocmVhZF9jb25kX3QgZW1wdHkgPSBQVEhSRUFEX0NPTkRfSU5JVElBTElaRVI7CmludCBjID0gMDsKdm9pZCogcHJvZHVjZXIodm9pZCogYXJnKTsKdm9pZCogY29uc3VtZXIodm9pZCogYXJnKTsKaW50IG1haW4oKSAKewogICAgcHRocmVhZF90IHByb2R1Y2VyX3RocmVhZCwgY29uc3VtZXJfdGhyZWFkOwogICAgcHRocmVhZF9jcmVhdGUoJnByb2R1Y2VyX3RocmVhZCwgTlVMTCwgcHJvZHVjZXIsIE5VTEwpOwogICAgcHRocmVhZF9jcmVhdGUoJmNvbnN1bWVyX3RocmVhZCwgTlVMTCwgY29uc3VtZXIsIE5VTEwpOwogICAgcHRocmVhZF9qb2luKHByb2R1Y2VyX3RocmVhZCwgTlVMTCk7CiAgICBwdGhyZWFkX2pvaW4oY29uc3VtZXJfdGhyZWFkLCBOVUxMKTsKICAgIHJldHVybiAwOwp9CnZvaWQqIHByb2R1Y2VyKHZvaWQqIGFyZykKewogICAgc3JhbmQodGltZShOVUxMKSk7CiAgICB3aGlsZSAoMSkgCiAgICB7CiAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCk7CiAgICAgICAgaWYgKGMgPT0gMiAqIE4pIAoJewogICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaW50IG51bSA9IHJhbmQoKSAlIDEwMCArIDE7CiAgICAgICAgaWYgKG51bSAlIDIgIT0gMCkgCgl7CiAgICAgICAgICAgIHdoaWxlICh0b3AgPT0gTiAtIDEpCgkgICAgewogICAgICAgICAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJmZ1bGwsICZtdXRleCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdG9wKys7CiAgICAgICAgICAgIHN0YWNrW3RvcF0gPSBudW07CiAgICAgICAgICAgIHByaW50ZigiUHJvZHVjZXIgYWRkZWQgJWQgdG8gdGhlIHN0YWNrXG4iLCBudW0pOwogICAgICAgICAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZlbXB0eSk7CiAgICAgICAgICAgIGMrKzsKICAgICAgICB9CiAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKICAgICAgICBzbGVlcCgxKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CnZvaWQqIGNvbnN1bWVyKHZvaWQqIGFyZykKewogICAgc3JhbmQodGltZShOVUxMKSk7CiAgICB3aGlsZSAoMSkgCiAgICB7CiAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCk7CiAgICAgICAgaWYgKGMgPT0gMiAqIE4pIAoJewogICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaW50IG51bSA9IHJhbmQoKSAlIDEwMCArIDE7CiAgICAgICAgaWYgKG51bSAlIDIgPT0gMCkgCgl7CiAgICAgICAgICAgIHdoaWxlICh0b3AgPT0gLTEpCgkgICAgewogICAgICAgICAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJmVtcHR5LCAmbXV0ZXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGludCBpdGVtID0gc3RhY2tbdG9wXTsKICAgICAgICAgICAgdG9wLS07CiAgICAgICAgICAgIHByaW50ZigiQ29uc3VtZXIgcmVtb3ZlZCAlZCBmcm9tIHRoZSBzdGFja1xuIiwgaXRlbSk7CiAgICAgICAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJmZ1bGwpOwogICAgICAgICAgICBjKys7CiAgICAgICAgfQogICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7CiAgICAgICAgc2xlZXAoMSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQ==