/* readerswriters.c */ #include #include #include #include #include #include #include #include #include "sem_ops.h" #define READERS 8 #define WRITERS 3 int counter = 0; int readers = 0; int reader_sem; int counter_sem; void *writerfunc( void * arg ) { /* function for each thread */ int *me; me = (int *) arg; srand( time( NULL ) ); sleep( rand() % 5 ); /* delay a while */ P( counter_sem ); counter++; printf( "Writer Thread %d running!! counter = %d\n", *me, counter ); V( counter_sem ); pthread_exit( NULL ); } void *readerfunc( void * arg ) { /* function for each thread */ int *me; me = (int *) arg; P( reader_sem ); readers++; if( readers == 1 ) P( counter_sem ); V( reader_sem ); srand( time( NULL ) ); sleep( rand() % 5 ); /* delay a while */ printf( "Reader Thread %d running!! counter = %d\n", *me, counter ); P( reader_sem ); readers--; if( readers == 0 ) V( counter_sem ); V( reader_sem ); pthread_exit( NULL ); } int main( void ) { int i; pthread_t rtid[READERS]; int readerid[READERS]; pthread_t wtid[WRITERS]; int writerid[WRITERS]; counter = 0; reader_sem = semtran( IPC_PRIVATE ); counter_sem = semtran( IPC_PRIVATE ); V( counter_sem ); /* initialise to 1 */ V( reader_sem ); /* initialise to 1 */ for( i=0; i