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 //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

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

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!