#include<stdio.h>
#include<semaphore.h>
#include<pthread.h>
#include<stdlib.h>
#define buffersize 10
pthread_mutex_t mutex;
pthread_t tidP[ 20 ] , tidC[ 20 ] ;
sem_t full, empty;
int counter;
int buffer[ buffersize] ;
void initialize( )
{
pthread_mutex_init( & mutex, NULL) ;
sem_init( & full, 1 , 0 ) ;
sem_init( & empty, 1 , buffersize) ;
counter= 0 ;
}
void write( int item)
{
buffer[ counter++ ] = item;
}
int read( )
{
return ( buffer[ -- counter] ) ;
}
void * producer ( void * param)
{
int waittime, item, i;
sem_wait( & empty) ;
pthread_mutex_lock( & mutex) ;
printf ( "\n Producer has produced item: %d\n " , item
) ; write( item) ;
pthread_mutex_unlock( & mutex) ;
sem_post( & full) ;
}
void * consumer ( void * param)
{
int waittime, item;
sem_wait( & full) ;
pthread_mutex_lock( & mutex) ;
item= read( ) ;
printf ( "\n Consumer has consumed item: %d\n " , item
) ; pthread_mutex_unlock( & mutex) ;
sem_post( & empty) ;
}
int main( )
{
int n1, n2, i;
initialize( ) ;
printf ( "\n Enter the no of producers: " ) ; printf ( "\n Enter the no of consumers: " ) ; for ( i= 0 ; i< n1; i++ )
pthread_create( & tidP[ i] , NULL, producer, NULL) ;
for ( i= 0 ; i< n2; i++ )
pthread_create( & tidC[ i] , NULL, consumer, NULL) ;
for ( i= 0 ; i< n1; i++ )
pthread_join( tidP[ i] , NULL) ;
for ( i= 0 ; i< n2; i++ )
pthread_join( tidC[ i] , NULL) ;
//sleep(5);
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c2VtYXBob3JlLmg+CiNpbmNsdWRlPHB0aHJlYWQuaD4KI2luY2x1ZGU8c3RkbGliLmg+CiNkZWZpbmUgYnVmZmVyc2l6ZSAxMApwdGhyZWFkX211dGV4X3QgbXV0ZXg7CnB0aHJlYWRfdCB0aWRQWzIwXSx0aWRDWzIwXTsKc2VtX3QgZnVsbCxlbXB0eTsKaW50IGNvdW50ZXI7CmludCBidWZmZXJbYnVmZmVyc2l6ZV07Cgp2b2lkIGluaXRpYWxpemUoKQp7CglwdGhyZWFkX211dGV4X2luaXQoJm11dGV4LE5VTEwpOwoJc2VtX2luaXQoJmZ1bGwsMSwwKTsKCXNlbV9pbml0KCZlbXB0eSwxLGJ1ZmZlcnNpemUpOwoJY291bnRlcj0wOwp9Cgp2b2lkIHdyaXRlKGludCBpdGVtKQp7CglidWZmZXJbY291bnRlcisrXT1pdGVtOwp9CgppbnQgcmVhZCgpCnsKCXJldHVybihidWZmZXJbLS1jb3VudGVyXSk7Cn0KCnZvaWQgKiBwcm9kdWNlciAodm9pZCAqIHBhcmFtKQp7CglpbnQgd2FpdHRpbWUsaXRlbSxpOwoJaXRlbT1yYW5kKCklNTsKCXdhaXR0aW1lPXJhbmQoKSU1OwoJc2VtX3dhaXQoJmVtcHR5KTsKCXB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgpOwoJcHJpbnRmKCJcblByb2R1Y2VyIGhhcyBwcm9kdWNlZCBpdGVtOiAlZFxuIixpdGVtKTsKCXdyaXRlKGl0ZW0pOwoJcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKCXNlbV9wb3N0KCZmdWxsKTsKfQoKdm9pZCAqIGNvbnN1bWVyICh2b2lkICogcGFyYW0pCnsKCWludCB3YWl0dGltZSxpdGVtOwoJd2FpdHRpbWU9cmFuZCgpJTU7CglzZW1fd2FpdCgmZnVsbCk7CglwdGhyZWFkX211dGV4X2xvY2soJm11dGV4KTsKCWl0ZW09cmVhZCgpOwoJcHJpbnRmKCJcbkNvbnN1bWVyIGhhcyBjb25zdW1lZCBpdGVtOiAlZFxuIixpdGVtKTsKCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7CglzZW1fcG9zdCgmZW1wdHkpOwp9CgppbnQgbWFpbigpCnsKCWludCBuMSxuMixpOwoJaW5pdGlhbGl6ZSgpOwoJcHJpbnRmKCJcbkVudGVyIHRoZSBubyBvZiBwcm9kdWNlcnM6ICIpOwoJc2NhbmYoIiVkIiwmbjEpOwoJcHJpbnRmKCJcbkVudGVyIHRoZSBubyBvZiBjb25zdW1lcnM6ICIpOwoJc2NhbmYoIiVkIiwmbjIpOwoJZm9yKGk9MDtpPG4xO2krKykKCQlwdGhyZWFkX2NyZWF0ZSgmdGlkUFtpXSxOVUxMLHByb2R1Y2VyLE5VTEwpOwoJZm9yKGk9MDtpPG4yO2krKykKCQlwdGhyZWFkX2NyZWF0ZSgmdGlkQ1tpXSxOVUxMLGNvbnN1bWVyLE5VTEwpOwoJZm9yKGk9MDtpPG4xO2krKykKCQlwdGhyZWFkX2pvaW4odGlkUFtpXSxOVUxMKTsKCWZvcihpPTA7aTxuMjtpKyspCgkJcHRocmVhZF9qb2luKHRpZENbaV0sTlVMTCk7CgoJLy9zbGVlcCg1KTsKCWV4aXQoMCk7Cn0=