Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Implement the Dining Philosophers problem [in C] by creating 5 threads and using

ID: 3834587 • Letter: I

Question

Implement the Dining Philosophers problem [in C] by creating 5 threads and using mutex for synchronization.

However, care must be taken to prevent a deadlock problem. One possible solution to alleviate the deadlock is known as “an asymmetric solution”, that is, an odd philosopher picks up first a left chopstick and then the right one, while an even philosopher picks up first a right chopstick and then the left one.

Write your C program using pthread_create for each dinning philosopher. Your program should take two arguments; a number of time to eat and a number of philosophers’ eating’s from the command line.

Program should look like:

% dphil 10 7 // each philosopher will eat 10 times before existing. There are 7 philosophers.

Philosopher 0 is thinking...

Philosopher 1 is eating...

Philosopher 3 is thinking...

Philosopher 4 is thinking...

Explanation / Answer

#include<stdio.h>

#include<semaphore.h>

#include<pthread.h>

  

#define N 5

#define THINKING 0

#define HUNGRY 1

#define EATING 2

#define LEFT (ph_num+4)%N

#define RIGHT (ph_num+1)%N

  

sem_t mutex;

sem_t S[N];

  

void * philospher(void *num);

void take_fork(int);

void put_fork(int);

void test(int);

  

int state[N];

int phil_num[N]={0,1,2,3,4};

  

int main()

{

    int i;

    pthread_t thread_id[N];

    sem_init(&mutex,0,1);

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

        sem_init(&S[i],0,0);

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

    {

        pthread_create(&thread_id[i],NULL,philospher,&phil_num[i]);

        printf("Philosopher %d is thinking ",i+1);

    }

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

        pthread_join(thread_id[i],NULL);

}

  

void *philospher(void *num)

{

    while(1)

    {

        int *i = num;

        sleep(1);

        take_fork(*i);

        sleep(0);

        put_fork(*i);

    }

}

  

void take_fork(int ph_num)

{

    sem_wait(&mutex);

    state[ph_num] = HUNGRY;

    printf("Philosopher %d is Hungry ",ph_num+1);

    test(ph_num);

    sem_post(&mutex);

    sem_wait(&S[ph_num]);

    sleep(1);

}

  

void test(int ph_num)

{

    if (state[ph_num] == HUNGRY && state[LEFT] != EATING && state[RIGHT] != EATING)

    {

        state[ph_num] = EATING;

        sleep(2);

        printf("Philosopher %d takes fork %d and %d ",ph_num+1,LEFT+1,ph_num+1);

        printf("Philosopher %d is Eating ",ph_num+1);

        sem_post(&S[ph_num]);

    }

}

  

void put_fork(int ph_num)

{

    sem_wait(&mutex);

    state[ph_num] = THINKING;

    printf("Philosopher %d putting fork %d and %d down ",ph_num+1,LEFT+1,ph_num+1);

    printf("Philosopher %d is thinking ",ph_num+1);

    test(LEFT);

    test(RIGHT);

    sem_post(&mutex);

}