Question: Create the program reader_writers.c: #include #include #include //compile and link with -pthread const int NUM_READERS_WRITERS = 10; pthread_cond_t cond; //condition pthread_mutex_t mutex; //lock, a.k.a. mutex
Create the program reader_writers.c:
| #include #include #include const int NUM_READERS_WRITERS = 10; pthread_cond_t cond; //condition pthread_mutex_t mutex; //lock, a.k.a. mutex int activeWritersNumber; int activeReadersNumber; void *read( void *ptr ) { int tid = (int) pthread_self(); int value; while(1){ printf( "\tReader %d wants to read! ", tid); pthread_mutex_lock(&mutex); while(activeWritersNumber > 0){ printf("\tReader %d is waiting... ", tid); pthread_cond_wait(&cond, &mutex); } ++activeReadersNumber; pthread_mutex_unlock(&mutex); printf("\tReader %d is reading! ", tid); printf("Number of active readers: %d, number of active writers: %d ", activeReadersNumber, activeWritersNumber ); usleep(rand() % 1000); pthread_mutex_lock(&mutex); --activeReadersNumber; printf("\tReader %d has finished reading. ", tid); printf("Number of active readers: %d, number of active writers: %d ", activeReadersNumber, activeWritersNumber ); if(activeReadersNumber == 0){ pthread_cond_signal(&cond); printf("\tReader %d was the last reader. Notifying one waiting writer.", tid); } pthread_mutex_unlock(&mutex); usleep(rand() % 1000); } } void *write( void *ptr ) { int tid = (int) pthread_self(); int value; while(1){ printf("\t\t\tWriter %d wants to write! ", tid); pthread_mutex_lock(&mutex); while(activeReadersNumber > 0 || activeWritersNumber > 0 ){ printf("\t\t\tWriter %d is waiting... ", tid); pthread_cond_wait(&cond, &mutex); } ++activeWritersNumber; pthread_mutex_unlock(&mutex); printf("\t\t\tWriter %d is writing! ", tid); printf("Number of active readers: %d, number of active writers: %d ", activeReadersNumber, activeWritersNumber ); usleep(rand() % 1000); pthread_mutex_lock(&mutex); --activeWritersNumber; printf("\t\t\tWriter %d has finished writing. Notifying waiting readers and writers. ",tid); printf("Number of active readers: %d, number of active writers: %d ", activeReadersNumber, activeWritersNumber ); pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex); usleep(rand() % 1000); } } int main() { pthread_t readers[NUM_READERS_WRITERS]; pthread_t writers[NUM_READERS_WRITERS]; activeWritersNumber = 0; activeReadersNumber = 0; pthread_mutex_init(&mutex, NULL); pthread_cond_init(&cond, NULL); srand(time(NULL)); int i; for(i = 0; i < NUM_READERS_WRITERS; i++){ pthread_create( &readers[i], NULL, read, NULL); pthread_create( &writers[i], NULL, write, NULL); } for(i = 0; i < NUM_READERS_WRITERS; i++){ pthread_join( readers[i], NULL); pthread_join( writers[i], NULL); } exit(0); } |
1.Run the reader_writers program for a few seconds. Then press <Ctrl+ C> to stop the program:
2. Copy and paste the output below. Check the output. Any problem noticeable? (Hint: starvation is a problem encountered where a process is perpetually denied necessary resources.)
Step by Step Solution
There are 3 Steps involved in it
Get step-by-step solutions from verified subject matter experts
