#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <time.h>
#include <unistd.h>
char q[ 10 ] ;
int number = 5 , buffer = 0 ;
sem_t fullsem, emptysem, producerSync, producerSync1, consumerSync, consumerSync1;
void producerPrinting( int i, char tmp, int p) {
printf ( "\n Producer#%d at i=%d : Inserted %c , buffer: %d" , p
, i
, tmp
, buffer
) ; }
char generateChar( ) {
sleep( 1 ) ;
return 'a' + ( ( rand ( ) * 100 ) % 26 ) ; }
void consumerProcess
( char * tmp
) { * tmp
= toupper ( * tmp
) ; }
void consumerPrinting( int i, char tmp, int c) {
printf ( "\n Consumer#%d at i=%d: Getting %c, buffer:%d" , c
, i
, tmp
, buffer
) ; }
void consumerRead( char * tmp) { * tmp= q[ -- buffer] ; }
void insert( char e) {
if ( buffer < number)
q[ buffer++ ] = e;
else
buffer = 0 ;
}
void * produce( void * a) {
int i;
for ( i = 0 ; i < number * 2 ; i++ ) {
sem_wait( & fullsem) ;
sem_wait( & producerSync1) ;
char tmp = generateChar( ) ;
insert( tmp) ;
producerPrinting( i, tmp, 1 ) ;
sem_post( & emptysem) ;
sem_post( & producerSync) ;
}
}
void * produce2( void * a) {
int i;
for ( i = 0 ; i < number * 2 ; i++ ) {
sem_wait( & fullsem) ;
sem_wait( & producerSync) ;
char tmp = generateChar( ) ;
insert( tmp) ;
producerPrinting( i, tmp, 2 ) ;
sem_post( & emptysem) ;
sem_post( & producerSync1) ;
}
}
void * consume( void * a) {
int i;
for ( i = 0 ; i < number * 2 ; i++ ) {
sem_wait( & emptysem) ;
sem_wait( & consumerSync1) ;
char tmp;
consumerRead( & tmp) ;
consumerProcess( & tmp) ;
consumerPrinting( i, tmp, 1 ) ;
sem_post( & fullsem) ;
sem_post( & consumerSync) ;
}
}
void * consume2( void * a) {
int i, v;
for ( i = 0 ; i < number * 2 ; i++ ) {
sem_wait( & emptysem) ;
sem_wait( & consumerSync) ;
char tmp;
consumerRead( & tmp) ;
consumerProcess( & tmp) ;
consumerPrinting( i, tmp, 2 ) ;
sem_post( & fullsem) ;
sem_post( & consumerSync1) ;
}
}
int main( ) {
pthread_t t[ 4 ] ;
sem_init( & fullsem, 0 , 10 ) ;
sem_init( & emptysem, 0 , 0 ) ;
sem_init( & producerSync, 0 , 0 ) ;
sem_init( & producerSync1, 0 , 1 ) ;
sem_init( & consumerSync, 0 , 1 ) ;
sem_init( & consumerSync1, 0 , 1 ) ;
pthread_create( & t[ 0 ] , NULL, & produce, NULL) ;
pthread_create( & t[ 1 ] , NULL, & produce2, NULL) ;
pthread_create( & t[ 2 ] , NULL, & consume, NULL) ;
pthread_create( & t[ 3 ] , NULL, & consume2, NULL) ;
pthread_join( t[ 0 ] , NULL) ;
pthread_join( t[ 1 ] , NULL) ;
pthread_join( t[ 2 ] , NULL) ;
pthread_join( t[ 3 ] , NULL) ;
sem_destroy( & fullsem) ;
sem_destroy( & emptysem) ;
sem_destroy( & consumerSync) ;
sem_destroy( & consumerSync1) ;
sem_destroy( & producerSync) ;
sem_destroy( & producerSync1) ;
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8bWF0aC5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKY2hhciBxWzEwXTsKaW50IG51bWJlciA9IDUsYnVmZmVyID0gMDsKc2VtX3QgZnVsbHNlbSwgZW1wdHlzZW0sIHByb2R1Y2VyU3luYywgcHJvZHVjZXJTeW5jMSwgY29uc3VtZXJTeW5jLCBjb25zdW1lclN5bmMxOwoKdm9pZCBwcm9kdWNlclByaW50aW5nKGludCBpLCBjaGFyIHRtcCwgaW50IHApIHsKICAgIHByaW50ZigiXG5Qcm9kdWNlciMlZCBhdCBpPSVkIDogSW5zZXJ0ZWQgJWMgLCBidWZmZXI6ICVkIiwgcCwgaSwgdG1wLCBidWZmZXIpOwp9CgpjaGFyIGdlbmVyYXRlQ2hhcigpIHsKICAgIHNsZWVwKDEpOwogICAgc3JhbmQodGltZShOVUxMKSk7CiAgICByZXR1cm4gJ2EnICsgKChyYW5kKCkgKiAxMDApICUgMjYpOwp9Cgp2b2lkIGNvbnN1bWVyUHJvY2VzcyhjaGFyICp0bXApIHsgKnRtcCA9IHRvdXBwZXIoKnRtcCk7IH0KCnZvaWQgY29uc3VtZXJQcmludGluZyhpbnQgaSwgY2hhciB0bXAsIGludCBjKSB7CiAgICBwcmludGYoIlxuQ29uc3VtZXIjJWQgYXQgaT0lZDogR2V0dGluZyAlYywgYnVmZmVyOiVkIiwgYywgaSwgdG1wLCBidWZmZXIpOwp9Cgp2b2lkIGNvbnN1bWVyUmVhZChjaGFyICp0bXApIHsgKnRtcD0gcVstLWJ1ZmZlcl07IH0Kdm9pZCBpbnNlcnQoY2hhciBlKSB7CiAgICBpZiAoYnVmZmVyIDwgbnVtYmVyKQogICAgICAgIHFbYnVmZmVyKytdID0gZTsKICAgIGVsc2UKICAgICAgICBidWZmZXIgPSAwOwp9CgoKdm9pZCAqcHJvZHVjZSh2b2lkICphKSB7CiAgICBpbnQgaTsKICAgIGZvciAoaSA9IDA7IGkgPCBudW1iZXIgKiAyOyBpKyspIHsKICAgICAgICBzZW1fd2FpdCgmZnVsbHNlbSk7CiAgICAgICAgc2VtX3dhaXQoJnByb2R1Y2VyU3luYzEpOwoKICAgICAgICBjaGFyIHRtcCA9IGdlbmVyYXRlQ2hhcigpOwogICAgICAgIGluc2VydCh0bXApOwogICAgICAgIHByb2R1Y2VyUHJpbnRpbmcoaSwgdG1wLCAxKTsKCiAgICAgICAgc2VtX3Bvc3QoJmVtcHR5c2VtKTsKICAgICAgICBzZW1fcG9zdCgmcHJvZHVjZXJTeW5jKTsKICAgIH0KfQoKCgp2b2lkICpwcm9kdWNlMih2b2lkICphKSB7CiAgICBpbnQgaTsKICAgIGZvciAoaSA9IDA7IGkgPCBudW1iZXIgKiAyOyBpKyspIHsKICAgICAgICBzZW1fd2FpdCgmZnVsbHNlbSk7CiAgICAgICAgc2VtX3dhaXQoJnByb2R1Y2VyU3luYyk7CiAgICAgICAgY2hhciB0bXAgPSBnZW5lcmF0ZUNoYXIoKTsKICAgICAgICBpbnNlcnQodG1wKTsKICAgICAgICBwcm9kdWNlclByaW50aW5nKGksIHRtcCwgMik7CgogICAgICAgIHNlbV9wb3N0KCZlbXB0eXNlbSk7CiAgICAgICAgc2VtX3Bvc3QoJnByb2R1Y2VyU3luYzEpOwoKICAgIH0KfQoKdm9pZCAqY29uc3VtZSh2b2lkICphKSB7CiAgICBpbnQgaTsKICAgIGZvciAoaSA9IDA7IGkgPCBudW1iZXIgKiAyOyBpKyspIHsKCiAgICAgICAgc2VtX3dhaXQoJmVtcHR5c2VtKTsKICAgICAgICBzZW1fd2FpdCgmY29uc3VtZXJTeW5jMSk7CiAgICAgICAgY2hhciB0bXA7CiAgICAgICAgY29uc3VtZXJSZWFkKCZ0bXApOwogICAgICAgIGNvbnN1bWVyUHJvY2VzcygmdG1wKTsKICAgICAgICBjb25zdW1lclByaW50aW5nKGksIHRtcCwgMSk7CgogICAgICAgIHNlbV9wb3N0KCZmdWxsc2VtKTsKICAgICAgICBzZW1fcG9zdCgmY29uc3VtZXJTeW5jKTsKICAgIH0KCgp9CgoKCnZvaWQgKmNvbnN1bWUyKHZvaWQgKmEpIHsKICAgIGludCBpLCB2OwogICAgZm9yIChpID0gMDsgaSA8IG51bWJlciAqIDI7IGkrKykgewoKICAgICAgICBzZW1fd2FpdCgmZW1wdHlzZW0pOwogICAgICAgIHNlbV93YWl0KCZjb25zdW1lclN5bmMpOwoKICAgICAgICBjaGFyIHRtcDsKICAgICAgICBjb25zdW1lclJlYWQoJnRtcCk7CiAgICAgICAgY29uc3VtZXJQcm9jZXNzKCZ0bXApOwogICAgICAgIGNvbnN1bWVyUHJpbnRpbmcoaSwgdG1wLCAyKTsKCiAgICAgICAgc2VtX3Bvc3QoJmZ1bGxzZW0pOwogICAgICAgIHNlbV9wb3N0KCZjb25zdW1lclN5bmMxKTsKCiAgICB9CgoKfQoKaW50IG1haW4oKSB7CiAgICBwdGhyZWFkX3QgdFs0XTsKICAgIHNlbV9pbml0KCZmdWxsc2VtLCAwLCAxMCk7CiAgICBzZW1faW5pdCgmZW1wdHlzZW0sIDAsIDApOwogICAgc2VtX2luaXQoJnByb2R1Y2VyU3luYywgMCwgMCk7CiAgICBzZW1faW5pdCgmcHJvZHVjZXJTeW5jMSwgMCwgMSk7CiAgICBzZW1faW5pdCgmY29uc3VtZXJTeW5jLCAwLCAxKTsKICAgIHNlbV9pbml0KCZjb25zdW1lclN5bmMxLCAwLCAxKTsKCiAgICBwdGhyZWFkX2NyZWF0ZSgmdFswXSwgTlVMTCwgJnByb2R1Y2UsIE5VTEwpOwogICAgcHRocmVhZF9jcmVhdGUoJnRbMV0sIE5VTEwsICZwcm9kdWNlMiwgTlVMTCk7CgogICAgcHRocmVhZF9jcmVhdGUoJnRbMl0sIE5VTEwsICZjb25zdW1lLCBOVUxMKTsKCgogICAgcHRocmVhZF9jcmVhdGUoJnRbM10sIE5VTEwsICZjb25zdW1lMiwgTlVMTCk7CgogICAgcHRocmVhZF9qb2luKHRbMF0sIE5VTEwpOwogICAgcHRocmVhZF9qb2luKHRbMV0sIE5VTEwpOwogICAgcHRocmVhZF9qb2luKHRbMl0sIE5VTEwpOwogICAgcHRocmVhZF9qb2luKHRbM10sIE5VTEwpOwogICAgc2VtX2Rlc3Ryb3koJmZ1bGxzZW0pOwogICAgc2VtX2Rlc3Ryb3koJmVtcHR5c2VtKTsKICAgIHNlbV9kZXN0cm95KCZjb25zdW1lclN5bmMpOwogICAgc2VtX2Rlc3Ryb3koJmNvbnN1bWVyU3luYzEpOwogICAgc2VtX2Rlc3Ryb3koJnByb2R1Y2VyU3luYyk7CiAgICBzZW1fZGVzdHJveSgmcHJvZHVjZXJTeW5jMSk7CgoKICAgIHJldHVybiAwOwp9
stdout
Producer#1 at i=0 : Inserted i , buffer: 1
Consumer#2 at i=0: Getting I, buffer:0
Producer#2 at i=0 : Inserted a , buffer: 1
Consumer#1 at i=0: Getting A, buffer:0
Producer#1 at i=1 : Inserted O , buffer: 1
Consumer#2 at i=1: Getting O, buffer:0
Producer#2 at i=1 : Inserted w , buffer: 1
Consumer#1 at i=1: Getting W, buffer:0
Producer#1 at i=2 : Inserted Q , buffer: 1
Consumer#2 at i=2: Getting Q, buffer:0
Producer#2 at i=2 : Inserted u , buffer: 1
Consumer#1 at i=2: Getting U, buffer:0
Producer#1 at i=3 : Inserted Q , buffer: 1
Consumer#2 at i=3: Getting Q, buffer:0
Producer#2 at i=3 : Inserted I , buffer: 1
Consumer#1 at i=3: Getting I, buffer:0
Producer#1 at i=4 : Inserted g , buffer: 1
Consumer#2 at i=4: Getting G, buffer:0
Producer#2 at i=4 : Inserted a , buffer: 1
Consumer#1 at i=4: Getting A, buffer:0
Producer#1 at i=5 : Inserted s , buffer: 1
Consumer#2 at i=5: Getting S, buffer:0
Producer#2 at i=5 : Inserted o , buffer: 1
Consumer#1 at i=5: Getting O, buffer:0
Producer#1 at i=6 : Inserted e , buffer: 1
Consumer#2 at i=6: Getting E, buffer:0
Producer#2 at i=6 : Inserted U , buffer: 1
Consumer#1 at i=6: Getting U, buffer:0
Producer#1 at i=7 : Inserted ] , buffer: 1
Consumer#2 at i=7: Getting ], buffer:0
Producer#2 at i=7 : Inserted U , buffer: 1
Consumer#1 at i=7: Getting U, buffer:0
Producer#1 at i=8 : Inserted K , buffer: 1
Consumer#2 at i=8: Getting K, buffer:0
Producer#2 at i=8 : Inserted a , buffer: 1
Consumer#1 at i=8: Getting A, buffer:0
Producer#1 at i=9 : Inserted [ , buffer: 1
Consumer#2 at i=9: Getting [, buffer:0
Producer#2 at i=9 : Inserted i , buffer: 1
Consumer#1 at i=9: Getting I, buffer:0