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

Consider the following solution to the dining Philosophers problem (which was di

ID: 3891894 • Letter: C

Question

Consider the following solution to the dining Philosophers problem (which was discussed in the lectures, but has a deadlock problem). In the space below, modify the code to resolve the deadlock problem such that even-numbered philosophers select (and return) chopsticks to their right, first, then to their left; and odd-numbered philosophers select (and return) chopsticks to their left, first, then to their right.

Consider the following solution to the dining Philosophers problem (which was discussed in the lectures, but has a deadlock problem). In the space below, modify the code to resolve the deadlock problem such that even-numbered philosophers select (and return) chopsticks to their right, first, then to their left, and odd-numbered philosophers select (and return) chopsticks to their left, first, then to their right philosopher(i) i *assume the Philosophers are seated in a circle assume these are binary semaphores*/ semaphore chopsticks[5] 1 while (true) { P(chopstick[il) P(chopstick[(it 1) % 5): pick left */ *pick right/ * return left*/ V(chopstick[il) V(chopstick[(+1) % 5)]; return right */

Explanation / Answer

#include <pthread.h>

#include <semaphore.h>

#include <stdio.h>

#define N 5

#define THINKING 2

#define HUNGRY 1

#define EATING 0

#define LEFT (phnum + 4) % N

#define RIGHT (phnum + 1) % N

int state[N];

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

sem_t mutex;

sem_t S[N];

void test(int phnum)

{

    if (state[phnum] == HUNGRY

        && state[LEFT] != EATING

        && state[RIGHT] != EATING) {

        // state that eating

        state[phnum] = EATING;

        sleep(2);

        printf("Philosopher %d takes fork %d and %d ",

                      phnum + 1, LEFT + 1, phnum + 1);

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

        // sem_post(&S[phnum]) has no effect

        // during takefork

        // used to wake up hungry philosophers

        // during putfork

        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 ", 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 that thinking

    state[phnum] = THINKING;

    printf("Philosopher %d putting fork %d and %d down ",

           phnum + 1, LEFT + 1, phnum + 1);

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

    test(LEFT);

    test(RIGHT);

    sem_post(&mutex);

}

void* philospher(void* num)

{

    while (1) {

        int* i = num;

        sleep(1);

        take_fork(*i);

        sleep(0);

        put_fork(*i);

    }

}

int main()

{

    int i;

    pthread_t thread_id[N];

    // initialize the semaphores

    sem_init(&mutex, 0, 1);

    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 ", i + 1);

    }

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

        pthread_join(thread_id[i], NULL);

}