#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define BSIZE 5
int buffer[ BSIZE] ;
int in = 0 ;
int out = 0 ;
int produced_count= 0 ;
int consumed_count= 0 ;
sem_t mutex_lock;
sem_t full_slots;
sem_t empty_slots;
void * produce( ) {
while ( 1 ) {
int new_stuff
= rand ( ) % 100 ;
sem_wait( & empty_slots) ;
sem_wait( & mutex_lock) ;
buffer[ in] = new_stuff;
printf ( "\n product number %d produced" , new_stuff
) ; in= ( in+ 1 ) % BSIZE;
sem_post( & mutex_lock) ;
sem_post( & full_slots) ;
}
pthread_exit( NULL) ;
}
void * consume( ) {
while ( 1 ) {
sem_wait( & full_slots) ;
sem_wait( & mutex_lock) ;
int consumed= buffer[ out] ;
printf ( "\n product number %d consumed" , consumed
) ; out= ( out+ 1 ) % BSIZE;
sem_post( & mutex_lock) ;
sem_post( & empty_slots) ;
}
pthread_exit( NULL) ;
}
int main( ) {
int p= 0 ; int c= 0 ;
int n= 0 , m= 0 ;
printf ( "\n enter number of producers: " ) ; printf ( "\n enter number of consumers: " ) ;
pthread_t producer[ n] ;
pthread_t consumer[ m] ;
sem_init( & mutex_lock, 0 , 1 ) ;
sem_init( & full_slots, 0 , 0 ) ;
sem_init( & empty_slots, 0 , BSIZE) ;
for ( int i= 0 ; i< n; i++ )
p= pthread_create( & producer[ i] , NULL, produce, NULL) ;
for ( int i = 0 ; i< m; i++ )
c= pthread_create( & consumer[ i] , NULL, consume, NULL) ;
for ( int i= 0 ; i< n; i++ )
pthread_join( producer[ i] , NULL) ;
for ( int i = 0 ; i< m; i++ )
pthread_join( consumer[ i] , NULL) ;
sem_destroy( & mutex_lock) ;
sem_destroy( & full_slots) ;
sem_destroy( & empty_slots) ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHB0aHJlYWQuaD4KI2luY2x1ZGUgPHNlbWFwaG9yZS5oPgojZGVmaW5lIEJTSVpFIDUKCgppbnQgYnVmZmVyW0JTSVpFXTsKaW50IGluID0gMDsKaW50IG91dCA9IDA7CmludCBwcm9kdWNlZF9jb3VudD0wOwppbnQgY29uc3VtZWRfY291bnQ9MDsKCnNlbV90IG11dGV4X2xvY2s7CnNlbV90IGZ1bGxfc2xvdHM7CnNlbV90IGVtcHR5X3Nsb3RzOwoKCnZvaWQqIHByb2R1Y2UoKXsKCQoJd2hpbGUoMSl7CgkJCgkJaW50IG5ld19zdHVmZj1yYW5kKCklMTAwOwoJCQoJCXNlbV93YWl0KCZlbXB0eV9zbG90cyk7CgkJc2VtX3dhaXQoJm11dGV4X2xvY2spOwoJCWJ1ZmZlcltpbl09bmV3X3N0dWZmOwoJCQoJCXByaW50ZigiXG5wcm9kdWN0IG51bWJlciAlZCBwcm9kdWNlZCIsbmV3X3N0dWZmKTsKCQlpbj0oaW4rMSklQlNJWkU7CgkJCgkJc2VtX3Bvc3QoJm11dGV4X2xvY2spOwoJCXNlbV9wb3N0KCZmdWxsX3Nsb3RzKTsKICAgICAgICAKCQkKCX0KCXB0aHJlYWRfZXhpdChOVUxMKTsKfQoKdm9pZCogY29uc3VtZSgpewoKCXdoaWxlKDEpewoJCQoJCXNlbV93YWl0KCZmdWxsX3Nsb3RzKTsKCQlzZW1fd2FpdCgmbXV0ZXhfbG9jayk7CgkJaW50IGNvbnN1bWVkPWJ1ZmZlcltvdXRdOwoJCXByaW50ZigiXG5wcm9kdWN0IG51bWJlciAlZCBjb25zdW1lZCIsY29uc3VtZWQpOwoJCW91dD0ob3V0KzEpJUJTSVpFOwoJCQoJCXNlbV9wb3N0KCZtdXRleF9sb2NrKTsKCQlzZW1fcG9zdCgmZW1wdHlfc2xvdHMpOwoJCQoJfQoKCXB0aHJlYWRfZXhpdChOVUxMKTsKfQoKCmludCBtYWluKCl7CglpbnQgcD0wO2ludCBjPTA7CglpbnQgbj0wLG09MDsKCXByaW50ZigiXG5lbnRlciBudW1iZXIgb2YgcHJvZHVjZXJzOiAiKTsKCXNjYW5mKCIlZCIsJm4pOwoJcHJpbnRmKCJcbmVudGVyIG51bWJlciBvZiBjb25zdW1lcnM6ICIpOwoJc2NhbmYoIiVkIiwmbSk7CgkKCXB0aHJlYWRfdCBwcm9kdWNlcltuXTsKCXB0aHJlYWRfdCBjb25zdW1lclttXTsKICAgCiAgICBzZW1faW5pdCgmbXV0ZXhfbG9jaywgMCwgMSk7CiAJc2VtX2luaXQoJmZ1bGxfc2xvdHMsIDAsIDApOwogICAgc2VtX2luaXQoJmVtcHR5X3Nsb3RzLCAwLCBCU0laRSk7CiAgICAKICAgIGZvcihpbnQgaT0wO2k8bjtpKyspCiAgICAJcD1wdGhyZWFkX2NyZWF0ZSgmcHJvZHVjZXJbaV0sIE5VTEwsIHByb2R1Y2UsIE5VTEwpOwogICAgCiAgICBmb3IoaW50IGkgPTA7aTxtO2krKykKICAgIAljPXB0aHJlYWRfY3JlYXRlKCZjb25zdW1lcltpXSwgTlVMTCwgY29uc3VtZSwgTlVMTCk7CiAgICAJCiAgICBmb3IoaW50IGk9MDtpPG47aSsrKQogIAkgICAgcHRocmVhZF9qb2luKHByb2R1Y2VyW2ldLE5VTEwpOwogICAgCQogICAgZm9yKGludCBpID0wO2k8bTtpKyspCiAgICAJcHRocmVhZF9qb2luKGNvbnN1bWVyW2ldLE5VTEwpOwogICAgCiAgICBzZW1fZGVzdHJveSgmbXV0ZXhfbG9jayk7CiAgICBzZW1fZGVzdHJveSgmZnVsbF9zbG90cyk7CiAgICBzZW1fZGVzdHJveSgmZW1wdHlfc2xvdHMpOwogICAgCn0=