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

How would this code for the dining philosopher problem be altered to allow user

ID: 3836992 • Letter: H

Question

How would this code for the dining philosopher problem be altered to allow user input for the amount of philosophers used? Thanks!

#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);

}

Explanation / Answer

Hi, i got your query.

in your program you have predefined array i.e int phil_num[N]={0,1,2,3,4};

replace this line of your code with the following:

int phil_num[MAX_SIZE]; //Declares an array of MAX_SIZE
int p, W;

printf("Enter the total no of philosophers you want: ");

    scanf("%d", &W);

    printf("Enter %d philosophers : ", W);

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

    {

        scanf("%d", &phil_num[p]);

    }

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote