#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
pthread_mutex_t mutex, wrt;
int s, rcount = 0 ;
void * writer( void * arg) {
pthread_mutex_lock( & wrt) ;
int d = ( ( int ) arg) ;
printf ( "--------------------------------------------------\n " ) ; printf ( "W%d Wait for Random time between 0ns and 10ns = %d\n " , d
, n
) ; sleep( n) ;
printf ( "Enter the number of time W%d want to write:\n " , d
) ; int t;
printf ( "Now W%d is writing... i.e. ADDING...\n " , d
) ; int j;
for ( j= 0 ; j< t; j++ ) {
printf ( "Enter the %dth INTEGER value to write:\n " , ( j
+ 1 ) ) ; int u;
s = s + u;
}
printf ( "UPDATED value of Shared variable = %d \n " , s
) ; printf ( "--------------------------------------------------\n " ) ; pthread_mutex_unlock( & wrt) ;
}
void * reader( void * arg) {
//Entry Part
pthread_mutex_lock( & mutex) ;
rcount++;
if ( rcount== 1 ) {
pthread_mutex_lock( & wrt) ; //No writer should come
}
pthread_mutex_unlock( & mutex) ; //so next reader can come
//Exit Part
int d = ( ( int ) arg) ;
printf ( "R%d wait for Random time between 0ns and 10ns = %d\n " , d
, n
) ; sleep( n) ;
printf ( "Enter the number of time R%d want to read:\n " , d
) ; int t;
printf ( "Now R%d is reading....\n " , d
) ; int j;
for ( j= 0 ; j< t; j++ ) {
printf ( "R%d read the shared value = %d\n " , d
, s
) ; }
printf ( "Number of Readers present = %d\n " , rcount
) ; pthread_mutex_lock( & mutex) ;
rcount--;
if ( rcount== 0 ) { //Now writer can come if they want
pthread_mutex_unlock( & wrt) ;
}
pthread_mutex_unlock( & mutex) ;
}
void main( ) {
printf ( "Enter the 'INTEGER' Initial value of share variable: \n " ) ; printf ( "---------------------------------------------\n " ) ; int rn, wn, i;
printf ( "Enter the no. of Reader:\n " ) ; for ( i= 0 ; i< rn; i++ ) {
}
printf ( "---------------------------------------------\n " ) ; printf ( "Enter the no. of Writer:\n " ) ; for ( i= 0 ; i< wn; i++ ) {
}
printf ( "---------------------------------------------\n " ) ;
pthread_t r[ rn] , w[ wn] ;
pthread_mutex_init( & wrt, NULL) ;
pthread_mutex_init( & mutex, NULL) ;
if ( rn< 0 || wn< 0 ) {
printf ( "Sorry: You have Entered NEGATIVE number of READER | WRITER\n " ) ; printf ( "Program is Terminating....\n " ) ; return ;
} else if ( rn == 0 ) {
printf ( "Sorry: You have not taken any READER\n " ) ; printf ( "No READER thread will be creaded\n " ) ; } else if ( wn == 0 ) {
printf ( "Sorry: You have not taken any WRITER\n " ) ; printf ( "No WRITER thread will be creaded\n " ) ; } else {
printf ( "Thread Creating....\n " ) ; }
printf ( "---------------------------------------------\n " ) ;
if ( wn== rn) {
for ( i= 0 ; i< wn; i++ ) {
pthread_create( & w[ i] , NULL, & writer, ( int * ) i) ;
pthread_create( & r[ i] , NULL, & reader, ( int * ) i) ;
}
for ( i= 0 ; i< wn; i++ ) {
pthread_join( w[ i] , NULL) ;
pthread_join( r[ i] , NULL) ;
}
} else if ( wn> rn) {
for ( i= 0 ; i< rn; i++ ) {
pthread_create( & w[ i] , NULL, & writer, ( int * ) i) ;
pthread_create( & r[ i] , NULL, & reader, ( int * ) i) ;
}
for ( i= rn; i< wn; i++ ) {
pthread_create( & w[ i] , NULL, & writer, ( int * ) i) ;
}
for ( i= 0 ; i< rn; i++ ) {
pthread_join( w[ i] , NULL) ;
pthread_join( r[ i] , NULL) ;
}
for ( i= rn; i< wn; i++ ) {
pthread_join( w[ i] , NULL) ;
}
} else {
for ( i= 0 ; i< wn; i++ ) {
pthread_create( & w[ i] , NULL, & writer, ( int * ) i) ;
pthread_create( & r[ i] , NULL, & reader, ( int * ) i) ;
}
for ( i= wn; i< rn; i++ ) {
pthread_create( & r[ i] , NULL, & reader, ( int * ) i) ;
}
for ( i= 0 ; i< wn; i++ ) {
pthread_join( w[ i] , NULL) ;
pthread_join( r[ i] , NULL) ;
}
for ( i= wn; i< rn; i++ ) {
pthread_join( r[ i] , NULL) ;
}
}
printf ( "-------------After joining the thread---------\n " ) ; printf ( "Final value of share variable = %d\n " , s
) ; }
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8cHRocmVhZC5oPgojaW5jbHVkZTxzdGRsaWIuaD4KI2luY2x1ZGU8dW5pc3RkLmg+CgpwdGhyZWFkX211dGV4X3QgbXV0ZXgsIHdydDsKaW50IHMsIHJjb3VudCA9IDA7Cgp2b2lkICp3cml0ZXIodm9pZCAqYXJnKXsKICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJndydCk7CiAgICAgICAgaW50IG4gPSByYW5kKCkgJSAxMDsKICAgICAgICBpbnQgZCA9ICgoaW50KWFyZyk7CiAgICAgICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICAgICAgcHJpbnRmKCJXJWQgV2FpdCBmb3IgUmFuZG9tIHRpbWUgYmV0d2VlbiAwbnMgYW5kIDEwbnMgPSAlZFxuIiwgZCwgbik7CiAgICAgICAgc2xlZXAobik7CiAgICAgICAgcHJpbnRmKCJFbnRlciB0aGUgbnVtYmVyIG9mIHRpbWUgVyVkIHdhbnQgdG8gd3JpdGU6XG4iLCBkKTsKICAgICAgICBpbnQgdDsKICAgICAgICBzY2FuZigiJWQiLCAmdCk7CiAgICAgICAgcHJpbnRmKCJOb3cgVyVkIGlzIHdyaXRpbmcuLi4gaS5lLiBBRERJTkcuLi5cbiIsIGQpOwogICAgICAgIGludCBqOwogICAgICAgIGZvcihqPTA7IGo8dDsgaisrKXsKICAgICAgICAgICAgICAgIHByaW50ZigiRW50ZXIgdGhlICVkdGggSU5URUdFUiB2YWx1ZSB0byB3cml0ZTpcbiIsIChqKzEpKTsKICAgICAgICAgICAgICAgIGludCB1OwogICAgICAgICAgICAgICAgc2NhbmYoIiVkIiwgJnUpOwogICAgICAgICAgICAgICAgcyA9IHMgKyB1OwogICAgICAgIH0KICAgICAgICBwcmludGYoIlVQREFURUQgdmFsdWUgb2YgU2hhcmVkIHZhcmlhYmxlID0gJWQgXG4iLCBzKTsKICAgICAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmd3J0KTsKfQoKdm9pZCAqcmVhZGVyKHZvaWQgKmFyZyl7CiAgICAgICAgLy9FbnRyeSBQYXJ0CiAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCk7CiAgICAgICAgcmNvdW50Kys7CiAgICAgICAgaWYocmNvdW50PT0xKXsKICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmd3J0KTsvL05vIHdyaXRlciBzaG91bGQgY29tZQogICAgICAgIH0KICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOy8vc28gbmV4dCByZWFkZXIgY2FuIGNvbWUKICAgICAgICAvL0V4aXQgUGFydAogICAgICAgIGludCBuID0gcmFuZCgpICUgMTA7CiAgICAgICAgaW50IGQgPSAoKGludClhcmcpOwogICAgICAgIHByaW50ZigiUiVkIHdhaXQgZm9yIFJhbmRvbSB0aW1lIGJldHdlZW4gMG5zIGFuZCAxMG5zID0gJWRcbiIsIGQsIG4pOwogICAgICAgIHNsZWVwKG4pOwogICAgICAgIHByaW50ZigiRW50ZXIgdGhlIG51bWJlciBvZiB0aW1lIFIlZCB3YW50IHRvIHJlYWQ6XG4iLCBkKTsKICAgICAgICBpbnQgdDsKICAgICAgICBzY2FuZigiJWQiLCAmdCk7CiAgICAgICAgcHJpbnRmKCJOb3cgUiVkIGlzIHJlYWRpbmcuLi4uXG4iLCBkKTsKICAgICAgICBpbnQgajsKICAgICAgICBmb3Ioaj0wOyBqPHQ7IGorKyl7CiAgICAgICAgICAgICAgICBwcmludGYoIlIlZCByZWFkIHRoZSBzaGFyZWQgdmFsdWUgPSAlZFxuIiwgZCwgcyk7CiAgICAgICAgfQogICAgICAgIHByaW50ZigiTnVtYmVyIG9mIFJlYWRlcnMgcHJlc2VudCA9ICVkXG4iLCByY291bnQpOwogICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgpOwogICAgICAgIHJjb3VudC0tOwogICAgICAgIGlmKHJjb3VudD09MCl7Ly9Ob3cgd3JpdGVyIGNhbiBjb21lIGlmIHRoZXkgd2FudAogICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJndydCk7CiAgICAgICAgfQogICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7Cn0KCnZvaWQgbWFpbigpewogICAgICAgIHByaW50ZigiRW50ZXIgdGhlICdJTlRFR0VSJyBJbml0aWFsIHZhbHVlIG9mIHNoYXJlIHZhcmlhYmxlOiBcbiIpOwogICAgICAgIHNjYW5mKCIlZCIsICZzKTsKICAgICAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICAgICAgaW50IHJuLCB3biwgaTsKICAgICAgICBwcmludGYoIkVudGVyIHRoZSBuby4gb2YgUmVhZGVyOlxuIik7CiAgICAgICAgc2NhbmYoIiVkIiwgJnJuKTsKICAgICAgICBmb3IoaT0wOyBpPHJuOyBpKyspewogICAgICAgICAgICAgICAgcHJpbnRmKCJSJWRcbiIsIGkpOwogICAgICAgIH0KICAgICAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICAgICAgcHJpbnRmKCJFbnRlciB0aGUgbm8uIG9mIFdyaXRlcjpcbiIpOwogICAgICAgIHNjYW5mKCIlZCIsICZ3bik7CiAgICAgICAgZm9yKGk9MDsgaTx3bjsgaSsrKXsKICAgICAgICAgICAgICAgIHByaW50ZigiVyVkXG4iLCBpKTsKICAgICAgICB9CiAgICAgICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwoKICAgICAgICBwdGhyZWFkX3Qgcltybl0sIHdbd25dOwogICAgICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmd3J0LCBOVUxMKTsKICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoJm11dGV4LCBOVUxMKTsKCiAgICAgICAgaWYocm48MCB8fCB3bjwwKXsKICAgICAgICAgICAgICAgIHByaW50ZigiU29ycnk6IFlvdSBoYXZlIEVudGVyZWQgTkVHQVRJVkUgbnVtYmVyIG9mIFJFQURFUiB8IFdSSVRFUlxuIik7CiAgICAgICAgICAgICAgICBwcmludGYoIlByb2dyYW0gaXMgVGVybWluYXRpbmcuLi4uXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9ZWxzZSBpZihybiA9PSAwKXsKICAgICAgICAgICAgICAgIHByaW50ZigiU29ycnk6IFlvdSBoYXZlIG5vdCB0YWtlbiBhbnkgUkVBREVSXG4iKTsKICAgICAgICAgICAgICAgIHByaW50ZigiTm8gUkVBREVSIHRocmVhZCB3aWxsIGJlIGNyZWFkZWRcbiIpOwogICAgICAgIH1lbHNlIGlmKHduID09IDApewogICAgICAgICAgICAgICAgcHJpbnRmKCJTb3JyeTogWW91IGhhdmUgbm90IHRha2VuIGFueSBXUklURVJcbiIpOwogICAgICAgICAgICAgICAgcHJpbnRmKCJObyBXUklURVIgdGhyZWFkIHdpbGwgYmUgY3JlYWRlZFxuIik7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICBwcmludGYoIlRocmVhZCBDcmVhdGluZy4uLi5cbiIpOwogICAgICAgIH0KICAgICAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CgogICAgICAgIGlmKHduPT1ybil7CiAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHduOyBpKyspewogICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmd1tpXSwgTlVMTCwgJndyaXRlciwgKGludCAqKWkpOwogICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmcltpXSwgTlVMTCwgJnJlYWRlciwgKGludCAqKWkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yKGk9MDsgaTx3bjsgaSsrKXsKICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9qb2luKHdbaV0sIE5VTEwpOwogICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2pvaW4ocltpXSwgTlVMTCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfWVsc2UgaWYod24+cm4pewogICAgICAgICAgICAgICAgZm9yKGk9MDsgaTxybjsgaSsrKXsKICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9jcmVhdGUoJndbaV0sIE5VTEwsICZ3cml0ZXIsIChpbnQgKilpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9jcmVhdGUoJnJbaV0sIE5VTEwsICZyZWFkZXIsIChpbnQgKilpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvcihpPXJuOyBpPHduOyBpKyspewogICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmd1tpXSwgTlVMTCwgJndyaXRlciwgKGludCAqKWkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yKGk9MDsgaTxybjsgaSsrKXsKICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9qb2luKHdbaV0sIE5VTEwpOwogICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2pvaW4ocltpXSwgTlVMTCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IoaT1ybjsgaTx3bjsgaSsrKXsKICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9qb2luKHdbaV0sIE5VTEwpOwogICAgICAgICAgICAgICAgfQogICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgZm9yKGk9MDsgaTx3bjsgaSsrKXsKICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9jcmVhdGUoJndbaV0sIE5VTEwsICZ3cml0ZXIsIChpbnQgKilpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9jcmVhdGUoJnJbaV0sIE5VTEwsICZyZWFkZXIsIChpbnQgKilpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvcihpPXduOyBpPHJuOyBpKyspewogICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmcltpXSwgTlVMTCwgJnJlYWRlciwgKGludCAqKWkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yKGk9MDsgaTx3bjsgaSsrKXsKICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9qb2luKHdbaV0sIE5VTEwpOwogICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2pvaW4ocltpXSwgTlVMTCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IoaT13bjsgaTxybjsgaSsrKXsKICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9qb2luKHJbaV0sIE5VTEwpOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwcmludGYoIi0tLS0tLS0tLS0tLS1BZnRlciBqb2luaW5nIHRoZSB0aHJlYWQtLS0tLS0tLS1cbiIpOwogICAgICAgIHByaW50ZigiRmluYWwgdmFsdWUgb2Ygc2hhcmUgdmFyaWFibGUgPSAlZFxuIiwgcyk7Cn0=