#include<stdio.h>
#include<pthread.h>
#include<semaphore.h>
sem_t mutex, writeblock;
int data = 0 , rcount = 0 ;
void * reader( void * arg)
{
int f;
f = ( ( int ) arg) ;
sem_wait( & mutex) ;
rcount = rcount + 1 ;
if ( rcount== 1 )
sem_wait( & writeblock) ;
sem_post( & mutex) ;
printf ( "Data read by the reader%d is %d\n " , f
, data
) ; sleep( 1 ) ;
sem_wait( & mutex) ;
rcount = rcount - 1 ;
if ( rcount== 0 )
sem_post( & writeblock) ;
sem_post( & mutex) ;
}
void * writer( void * arg)
{
int f;
f = ( ( int ) arg) ;
sem_wait( & writeblock) ;
data++;
printf ( "Data writen by the writer%d is %d\n " , f
, data
) ; sleep( 1 ) ;
sem_post( & writeblock) ;
}
int main( )
{
int i, b;
pthread_t rtid[ 5 ] , wtid[ 5 ] ;
sem_init( & mutex, 0 , 1 ) ;
sem_init( & writeblock, 0 , 1 ) ;
for ( i= 0 ; i<= 2 ; i++ )
{
pthread_create( & wtid[ i] , NULL, writer, ( void * ) i) ;
pthread_create( & rtid[ i] , NULL, reader, ( void * ) i) ;
}
for ( i= 0 ; i<= 2 ; i++ )
{
pthread_join( wtid[ i] , NULL) ;
pthread_join( rtid[ i] , NULL) ;
}
return 0 ;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8cHRocmVhZC5oPgojaW5jbHVkZTxzZW1hcGhvcmUuaD4KCnNlbV90IG11dGV4LHdyaXRlYmxvY2s7CmludCBkYXRhID0gMCxyY291bnQgPSAwOwoKdm9pZCAqcmVhZGVyKHZvaWQgKmFyZykKewogIGludCBmOwogIGYgPSAoKGludClhcmcpOwogIHNlbV93YWl0KCZtdXRleCk7CiAgcmNvdW50ID0gcmNvdW50ICsgMTsKICBpZihyY291bnQ9PTEpCiAgIHNlbV93YWl0KCZ3cml0ZWJsb2NrKTsKICBzZW1fcG9zdCgmbXV0ZXgpOwogIHByaW50ZigiRGF0YSByZWFkIGJ5IHRoZSByZWFkZXIlZCBpcyAlZFxuIixmLGRhdGEpOwogIHNsZWVwKDEpOwogIHNlbV93YWl0KCZtdXRleCk7CiAgcmNvdW50ID0gcmNvdW50IC0gMTsKICBpZihyY291bnQ9PTApCiAgIHNlbV9wb3N0KCZ3cml0ZWJsb2NrKTsKICBzZW1fcG9zdCgmbXV0ZXgpOwp9Cgp2b2lkICp3cml0ZXIodm9pZCAqYXJnKQp7CiAgaW50IGY7CiAgZiA9ICgoaW50KSBhcmcpOwogIHNlbV93YWl0KCZ3cml0ZWJsb2NrKTsKICBkYXRhKys7CiAgcHJpbnRmKCJEYXRhIHdyaXRlbiBieSB0aGUgd3JpdGVyJWQgaXMgJWRcbiIsZixkYXRhKTsKICBzbGVlcCgxKTsKICBzZW1fcG9zdCgmd3JpdGVibG9jayk7Cn0KCmludCBtYWluKCkKewogIGludCBpLGI7IAogIHB0aHJlYWRfdCBydGlkWzVdLHd0aWRbNV07CiAgc2VtX2luaXQoJm11dGV4LDAsMSk7CiAgc2VtX2luaXQoJndyaXRlYmxvY2ssMCwxKTsKICBmb3IoaT0wO2k8PTI7aSsrKQogIHsKICAgIHB0aHJlYWRfY3JlYXRlKCZ3dGlkW2ldLE5VTEwsd3JpdGVyLCh2b2lkICopaSk7CiAgICBwdGhyZWFkX2NyZWF0ZSgmcnRpZFtpXSxOVUxMLHJlYWRlciwodm9pZCAqKWkpOwogIH0KICBmb3IoaT0wO2k8PTI7aSsrKQogIHsKICAgIHB0aHJlYWRfam9pbih3dGlkW2ldLE5VTEwpOwogICAgcHRocmVhZF9qb2luKHJ0aWRbaV0sTlVMTCk7CiAgfQogIHJldHVybiAwOwp9