#include<semaphore.h>
#include<pthread.h>
#include<stdio.h>
int rc= 0 , wc= 0 , val;
pthread_mutex_t mutex1, mwrite, mread, rallow;
pthread_t tr1, tr2, tw1, tw2;
pthread_attr_t tr1attr, tr2attr, tw1attr, tw2attr;
/* visit www.rpv.tk for more */
void * writer( ) ;
void * reader( ) ;
int main( )
{
pthread_mutex_init( & mwrite, NULL) ;
pthread_mutex_init( & mread, NULL) ;
pthread_mutex_init( & rallow, NULL) ;
pthread_mutex_init( & mutex1, NULL) ;
pthread_attr_init( & tw1attr) ;
pthread_attr_init( & tr1attr) ;
pthread_attr_init( & tr2attr) ;
pthread_attr_init( & tw2attr) ;
printf ( "\n Writer 1 created" ) ;
pthread_create( & tw1,& tw1attr, writer, NULL) ;
printf ( "\n Reader 1 created" ) ;
pthread_create( & tr1,& tr1attr, reader, NULL) ;
printf ( "\n Reader 2 created" ) ;
pthread_create( & tr2,& tr2attr, reader, NULL) ;
printf ( "\n WRITER 2 created" ) ;
pthread_create( & tw2,& tw2attr, writer, NULL) ;
pthread_join( tw1, NULL) ;
pthread_join( tr1, NULL) ;
pthread_join( tr2, NULL) ;
pthread_join( tw2, NULL) ;
/* Aditya Jain */
return 0 ;
}
void * writer( )
{
pthread_mutex_lock( & mwrite) ;
wc++;
if ( wc== 1 )
pthread_mutex_lock( & rallow) ;
pthread_mutex_unlock( & mwrite) ;
pthread_mutex_lock( & mutex1) ;
printf ( "\n Enter data in writer %d" , wc
) ;
pthread_mutex_unlock( & mutex1) ;
pthread_mutex_lock( & mwrite) ;
wc--;
if ( wc== 0 )
pthread_mutex_unlock( & rallow) ;
pthread_mutex_unlock( & mwrite) ;
pthread_exit( 0 ) ;
}
void * reader( )
{
pthread_mutex_lock( & rallow) ;
pthread_mutex_lock( & mread) ;
rc++;
if ( rc== 1 )
pthread_mutex_lock( & mutex1) ;
pthread_mutex_unlock( & mread) ;
pthread_mutex_unlock( & rallow) ;
printf ( "\n reader %d read data: %d" , rc
, val
) ;
pthread_mutex_lock( & mread) ;
rc--;
if ( rc== 0 )
pthread_mutex_unlock( & mutex1) ;
pthread_mutex_unlock( & mread) ;
pthread_exit( 0 ) ;
}
I2luY2x1ZGU8c2VtYXBob3JlLmg+CgojaW5jbHVkZTxwdGhyZWFkLmg+CgojaW5jbHVkZTxzdGRpby5oPgoKCmludCByYz0wLHdjPTAsdmFsOwoKcHRocmVhZF9tdXRleF90IG11dGV4MSxtd3JpdGUsbXJlYWQscmFsbG93OwoKcHRocmVhZF90IHRyMSx0cjIsdHcxLHR3MjsKCnB0aHJlYWRfYXR0cl90IHRyMWF0dHIsdHIyYXR0cix0dzFhdHRyLHR3MmF0dHI7Ci8qIHZpc2l0IHd3dy5ycHYudGsgZm9yIG1vcmUgKi8KCnZvaWQgKndyaXRlcigpOwoKdm9pZCAqcmVhZGVyKCk7CgoKaW50IG1haW4oKQoKewoKIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbXdyaXRlLE5VTEwpOwoKIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbXJlYWQsTlVMTCk7CgogcHRocmVhZF9tdXRleF9pbml0KCZyYWxsb3csTlVMTCk7CgogcHRocmVhZF9tdXRleF9pbml0KCZtdXRleDEsTlVMTCk7CgoKIHB0aHJlYWRfYXR0cl9pbml0KCZ0dzFhdHRyKTsKCiBwdGhyZWFkX2F0dHJfaW5pdCgmdHIxYXR0cik7CgogcHRocmVhZF9hdHRyX2luaXQoJnRyMmF0dHIpOwoKIHB0aHJlYWRfYXR0cl9pbml0KCZ0dzJhdHRyKTsKCgogcHJpbnRmKCJcbiBXcml0ZXIgMSBjcmVhdGVkIik7CgogcHRocmVhZF9jcmVhdGUoJnR3MSwmdHcxYXR0cix3cml0ZXIsTlVMTCk7CgogcHJpbnRmKCJcbiBSZWFkZXIgMSBjcmVhdGVkIik7CgoKIHB0aHJlYWRfY3JlYXRlKCZ0cjEsJnRyMWF0dHIscmVhZGVyLE5VTEwpOwoKIHByaW50ZigiXG4gUmVhZGVyIDIgY3JlYXRlZCIpOwoKIHB0aHJlYWRfY3JlYXRlKCZ0cjIsJnRyMmF0dHIscmVhZGVyLE5VTEwpOwoKIHByaW50ZigiXG4gV1JJVEVSIDIgY3JlYXRlZCIpOwoKIHB0aHJlYWRfY3JlYXRlKCZ0dzIsJnR3MmF0dHIsd3JpdGVyLE5VTEwpOwoKCiBwdGhyZWFkX2pvaW4odHcxLE5VTEwpOwoKIHB0aHJlYWRfam9pbih0cjEsTlVMTCk7CgogcHRocmVhZF9qb2luKHRyMixOVUxMKTsKCiBwdGhyZWFkX2pvaW4odHcyLE5VTEwpOwovKiBBZGl0eWEgSmFpbiAqLwoKIHJldHVybiAwOwoKfQoKCnZvaWQgKndyaXRlcigpCgp7CgogcHRocmVhZF9tdXRleF9sb2NrKCZtd3JpdGUpOwoKIHdjKys7CgogaWYod2M9PTEpCgogIHB0aHJlYWRfbXV0ZXhfbG9jaygmcmFsbG93KTsKCiBwdGhyZWFkX211dGV4X3VubG9jaygmbXdyaXRlKTsKCgogcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleDEpOwoKIHByaW50ZigiXG4gRW50ZXIgZGF0YSBpbiB3cml0ZXIgJWQiLHdjKTsKCiBzY2FuZigiJWQiLCZ2YWwpOwoKIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleDEpOwoKCiBwdGhyZWFkX211dGV4X2xvY2soJm13cml0ZSk7Cgogd2MtLTsKCiBpZih3Yz09MCkKCiAgcHRocmVhZF9tdXRleF91bmxvY2soJnJhbGxvdyk7CgogcHRocmVhZF9tdXRleF91bmxvY2soJm13cml0ZSk7CgogcHRocmVhZF9leGl0KDApOwoKfQoKCnZvaWQgKnJlYWRlcigpCgp7CgogcHRocmVhZF9tdXRleF9sb2NrKCZyYWxsb3cpOwoKIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXJlYWQpOwoKIHJjKys7CgogaWYocmM9PTEpCgogIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgxKTsKCiBwdGhyZWFkX211dGV4X3VubG9jaygmbXJlYWQpOwoKIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZyYWxsb3cpOwoKCiBwcmludGYoIlxuIHJlYWRlciAlZCByZWFkIGRhdGE6ICVkIixyYyx2YWwpOwoKCiBwdGhyZWFkX211dGV4X2xvY2soJm1yZWFkKTsKCiByYy0tOwoKIGlmKHJjPT0wKQoKICBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgxKTsKCiBwdGhyZWFkX211dGV4X3VubG9jaygmbXJlYWQpOwoKIHB0aHJlYWRfZXhpdCgwKTsKCn0=