Question: Can someone please fix the logical error in this code? It keeps looping. #include #include #include #define N 5 #define THINKING 2 #define HUNGRY 1

Can someone please fix the logical error in this code? It keeps looping.

#include #include #include #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[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]); } }

void take_fork(int phnum){ sem_wait(&mutex); state[phnum] = HUNGRY; printf("Philosopher %d is Hungry ", phnum + 1); test(phnum); sem_post(&mutex); sem_wait(&S[phnum]); sleep(1); }

void put_fork(int phnum){ sem_wait(&mutex); 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(void){ 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[i]); printf("Philosopher %d is thinking ", i + 1); } for (i = 0; i < N; i++){ pthread_join(thread_id[i], NULL); } }

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!