#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#define BUFFER_SIZE 5
#define NUM_ITEMS 10
int buffer[ BUFFER_SIZE] ;
int in = 0 , out = 0 ;
sem_t empty_slots, full_slots, mutex;
void * producer( void * arg) {
int item;
for ( int i = 0 ; i < NUM_ITEMS; i++ ) {
item = i;
sem_wait( & empty_slots) ;
sem_wait( & mutex) ;
buffer[ in] = item;
printf ( "Produced %d\n " , item
) ; in = ( in + 1 ) % BUFFER_SIZE;
sem_post( & mutex) ;
sem_post( & full_slots) ;
usleep( 200000 ) ; // Sleep to simulate production time
}
pthread_exit( NULL) ;
}
void * consumer( void * arg) {
int item;
for ( int i = 0 ; i < NUM_ITEMS; i++ ) {
sem_wait( & full_slots) ;
sem_wait( & mutex) ;
item = buffer[ out] ;
printf ( "Consumed %d\n " , item
) ; out = ( out + 1 ) % BUFFER_SIZE;
sem_post( & mutex) ;
sem_post( & empty_slots) ;
usleep( 500000 ) ; // Sleep to simulate consumption time
}
pthread_exit( NULL) ;
}
int main( ) {
pthread_t producer_thread, consumer_thread;
sem_init( & empty_slots, 0 , BUFFER_SIZE) ;
sem_init( & full_slots, 0 , 0 ) ;
sem_init( & mutex, 0 , 1 ) ;
pthread_create( & producer_thread, NULL, producer, NULL) ;
pthread_create( & consumer_thread, NULL, consumer, NULL) ;
pthread_join( producer_thread, NULL) ;
pthread_join( consumer_thread, NULL) ;
sem_destroy( & empty_slots) ;
sem_destroy( & full_slots) ;
sem_destroy( & mutex) ;
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKI2RlZmluZSBCVUZGRVJfU0laRSA1CiNkZWZpbmUgTlVNX0lURU1TIDEwCgppbnQgYnVmZmVyW0JVRkZFUl9TSVpFXTsKaW50IGluID0gMCwgb3V0ID0gMDsKCnNlbV90IGVtcHR5X3Nsb3RzLCBmdWxsX3Nsb3RzLCBtdXRleDsKCnZvaWQgKnByb2R1Y2VyKHZvaWQgKmFyZykgewogICAgaW50IGl0ZW07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9JVEVNUzsgaSsrKSB7CiAgICAgICAgaXRlbSA9IGk7CiAgICAgICAgc2VtX3dhaXQoJmVtcHR5X3Nsb3RzKTsKICAgICAgICBzZW1fd2FpdCgmbXV0ZXgpOwogICAgICAgIAogICAgICAgIGJ1ZmZlcltpbl0gPSBpdGVtOwogICAgICAgIHByaW50ZigiUHJvZHVjZWQgJWRcbiIsIGl0ZW0pOwogICAgICAgIGluID0gKGluICsgMSkgJSBCVUZGRVJfU0laRTsKCiAgICAgICAgc2VtX3Bvc3QoJm11dGV4KTsKICAgICAgICBzZW1fcG9zdCgmZnVsbF9zbG90cyk7CiAgICAgICAgdXNsZWVwKDIwMDAwMCk7IC8vIFNsZWVwIHRvIHNpbXVsYXRlIHByb2R1Y3Rpb24gdGltZQogICAgfQogICAgcHRocmVhZF9leGl0KE5VTEwpOwp9Cgp2b2lkICpjb25zdW1lcih2b2lkICphcmcpIHsKICAgIGludCBpdGVtOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fSVRFTVM7IGkrKykgewogICAgICAgIHNlbV93YWl0KCZmdWxsX3Nsb3RzKTsKICAgICAgICBzZW1fd2FpdCgmbXV0ZXgpOwogICAgICAgIAogICAgICAgIGl0ZW0gPSBidWZmZXJbb3V0XTsKICAgICAgICBwcmludGYoIkNvbnN1bWVkICVkXG4iLCBpdGVtKTsKICAgICAgICBvdXQgPSAob3V0ICsgMSkgJSBCVUZGRVJfU0laRTsKCiAgICAgICAgc2VtX3Bvc3QoJm11dGV4KTsKICAgICAgICBzZW1fcG9zdCgmZW1wdHlfc2xvdHMpOwogICAgICAgIHVzbGVlcCg1MDAwMDApOyAvLyBTbGVlcCB0byBzaW11bGF0ZSBjb25zdW1wdGlvbiB0aW1lCiAgICB9CiAgICBwdGhyZWFkX2V4aXQoTlVMTCk7Cn0KCmludCBtYWluKCkgewogICAgcHRocmVhZF90IHByb2R1Y2VyX3RocmVhZCwgY29uc3VtZXJfdGhyZWFkOwogICAgCiAgICBzZW1faW5pdCgmZW1wdHlfc2xvdHMsIDAsIEJVRkZFUl9TSVpFKTsKICAgIHNlbV9pbml0KCZmdWxsX3Nsb3RzLCAwLCAwKTsKICAgIHNlbV9pbml0KCZtdXRleCwgMCwgMSk7CgogICAgcHRocmVhZF9jcmVhdGUoJnByb2R1Y2VyX3RocmVhZCwgTlVMTCwgcHJvZHVjZXIsIE5VTEwpOwogICAgcHRocmVhZF9jcmVhdGUoJmNvbnN1bWVyX3RocmVhZCwgTlVMTCwgY29uc3VtZXIsIE5VTEwpOwoKICAgIHB0aHJlYWRfam9pbihwcm9kdWNlcl90aHJlYWQsIE5VTEwpOwogICAgcHRocmVhZF9qb2luKGNvbnN1bWVyX3RocmVhZCwgTlVMTCk7CgogICAgc2VtX2Rlc3Ryb3koJmVtcHR5X3Nsb3RzKTsKICAgIHNlbV9kZXN0cm95KCZmdWxsX3Nsb3RzKTsKICAgIHNlbV9kZXN0cm95KCZtdXRleCk7CgogICAgcmV0dXJuIDA7Cn0K