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

Provide an outline of a solution to the dining-philosophers problem using monito

ID: 3745154 • Letter: P

Question

Provide an outline of a solution to the dining-philosophers problem using monitors. Hence simulate the solution using any language. The C language version is here:

monitor DiningPhilosophers

{

enum {THINKING, HUNGRY, EATING} state[5];

condition self[5];

void pickup(int i) {

state[i] = HUNGRY;

test(i);

if (state[i] != EATING)

self[i].wait();

}

void putdown(int i) {

state[i] = THINKING;

test((i + 4) % 5);

test((i + 1) % 5);

}

void test(int i) {

if ((state[(i + 4) % 5] != EATING) &&

(state[i] == HUNGRY) &&

(state[(i + 1) % 5] != EATING)) {

state[i] = EATING;

self[i].signal();

}

}

initialization code() {

for (int i = 0; i < 5; i++)

state[i] = THINKING;

}

}

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

}

}

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