In: Computer Science
C programming:
Using the following rules of the Dining philosophers problem:
• N philosophers spend their lives thinking and eating rice.
• There are only N chopstick on the table, one between every two philosophers.
• In order to eat, a philosopher needs to get hold of the two chopsticks that are closest to her.
• A philosopher cannot pick up a chopstick that is already taken by a neighbor.
Implement the dining philosophers problem using pthreads and monitor.
Your program should print the philosopher that is eating, the chopsticks that is using and when the philosopher finished eating.
A correct implementation will run like this:
./diningPhilo Philosopher 0 is eating using:0,1 Philosopher 2 is eating using:2,3 Philosopher 4 is eating using:4,5 Philosopher 8 is eating using:8,9 Philosopher 6 is eating using:6,7 Philosopher 0 finished eating Philosopher 6 finished eating Philosopher 6 is eating using:6,7 Philosopher 2 finished eating ...
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#define THINKING 2
#define HUNGRY 1
#define EATING 0
#define LEFT (phnum+n-1)% N
#define RIGHT (phnum+1)%N
int state[N];
int phil[N];
sem_t mutex;
sem_t S[N];
void test(int phnum)
{
if (state[phnum] == HUNGRY
&& state[LEFT] !=
EATING
&& state[RIGHT] !=
EATING)
{
state[phnum] = EATING;
sleep(2);
printf("Philosopher %d is
Eating\n", phnum,phnum + 1);
sem_post(&S[phnum]);
}
}
// take up chopsticks
void take_fork(int phnum)
{
sem_wait(&mutex);
// state that hungry
state[phnum] = HUNGRY;
printf("Philosopher %d is Hungry\n", phnum + 1);
// eat if neighbours are not eating
test(phnum);
sem_post(&mutex);
// if unable to eat wait to be signalled
sem_wait(&S[phnum]);
sleep(1);
}
// put down chopsticks
void put_fork(int phnum)
{
sem_wait(&mutex);
state[phnum] = THINKING;
printf("Philosopher %d putting fork %d and %d
down\n",
phnum + 1, LEFT + 1, phnum +
1);
printf("Philosopher %d is thinking\n", phnum + 1);
test(LEFT);
test(RIGHT);
sem_post(&mutex);
}
void finish(int phnum)
{
sem_wait(&mutex);
printf("philosopher %d finished eating\n",phnum);
test(phnum);
sem_post(&mutex);
sem_wait(&s[phnum]);
sleep(1);
}
void* philospher(void* num)
{
while (1) {
int* i = num;
sleep(1);
take_fork(*i);
sleep(0);
put_fork(*i);
sleep(1);
finish(*i);
}
}
int main()
{
int i;
pthread_t thread_id[N];
// initialize the semaphores
sem_init(&mutex, 0, 1);
printf("enter the total number of philosophers having in a dinning table : \n");
scanf("%d",&n);
printf("ente the id's of each philosopher: \n");
for (i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for (i = 0; i < N; i++)
sem_init(&S[i], 0, 0);
for (i = 0; i < N; i++) {
// create philosopher
processes
pthread_create(&thread_id[i],
NULL,
philospher,
&phil[i]);
printf("Philosopher %d is
thinking\n", i + 1);
}
for (i = 0; i < N; i++)
pthread_join(thread_id[i],
NULL);
}