118k views
4 votes
on 5.7.3, we provide an outline of a solution to the dining-philosophers problem using monitors. This problem will require implementing a solution using Pthreads mutex locks and condition variables.The PhilosophersBegin by creating five philosophers, each identified by a number 0 . . 4. Each philosopher will run as a separate thread. Thread creation using Pthreads is covered in Section 4.4.1. Philosophers alternate between thinking and eating. To simulate both activities, have the thread sleep() for a random period between one and three seconds. When a philosopher wishes to eat, she invokes the functionpickup_forks(int philosopher_number)where philosopher number identifies the number of the philosopher wishing to eat. When a philosopher finishes eating, she invokesreturn_forks(int philosopher_number

1 Answer

4 votes

Answer:

See explaination for program code.

Step-by-step explanation:

#include <stdio.h>

#include <pthread.h>

#include <stdlib.h>

#include <unistd.h>

#define NO_OF_PHILOSOPHERS 5

pthread_t philosophers[NO_OF_PHILOSOPHERS];

pthread_mutex_t mutex_forks = PTHREAD_MUTEX_INITIALIZER;;

int forks[NO_OF_PHILOSOPHERS];

void init()

{

int i;

for(i=0; i<NO_OF_PHILOSOPHERS; i++)

forks[i] = 0;

}

void philosopher(int i)

{

int right = i;

int left = (i - 1 == -1) ? NO_OF_PHILOSOPHERS - 1 : (i - 1);

int locked;

while(1)

{

locked = 0;

while(!locked)

{

pthread_mutex_lock(&mutex_forks);

if(forks[right] || forks[left])

{

pthread_mutex_unlock(&mutex_forks); // give up the forks unless you can take both at once.

printf("Philosopher %d cannot take forks. Giving up and thinking.\\",i);

usleep(random() % 1000); // think.

continue;

}

forks[right] = 1; // take forks.

forks[left] = 1;

pthread_mutex_unlock(&mutex_forks);

locked = 1;

}

printf("Philosopher %d took both forks. Now eating :)\\",i);

usleep(random() % 500);

printf("Philosopher %d done with eating. Giving up forks.\\",i);

pthread_mutex_lock(&mutex_forks); // give up forks.

forks[right] = 0;

forks[left] = 0;

pthread_mutex_unlock(&mutex_forks);

usleep(random() % 1000);

}

}

int main()

{

init();

int i;

for(i=0; i<NO_OF_PHILOSOPHERS; i++)

pthread_create( &philosophers[i], NULL, philosopher, (void*)i);

for(i=0; i<NO_OF_PHILOSOPHERS; i++)

pthread_join(philosophers[i],NULL);

return 0;

}

User Itsclarke
by
6.2k points