﻿ Dining Philosophers Problem | The Code Cracker

## Dining Philosophers Problem

Dining philosophers problem is a classic multiprocess synchronisation problem. Problem is summarised as 5 philosophers sitting at a round table doing 2 things, eating and thinking. While eating they are not thinking and while thinking they are not eating. Each philosophers have plates, that is 5 plates. And there is fork places between each pair of adjacent philosophers, that is total of 5 forks. Each philosopher need 2 forks to eat. Each philosopher can only use the forks on his immediate left and immediate right.
Here is the solution for the Dining philosophers problem.

```/*
Name        :   Dining Philosophers Problem
Author      :   jishnu7
Web         :   http://thecodecracker.com
Date        :   26-Sep-2010
Description :   C Program to solve Dining philosophers problem
*/

#include<stdio.h>
#include<semaphore.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;
sem_init(&mutex,0,1);
for(i=0;i<N;i++)
sem_init(&S[i],0,0);
for(i=0;i<N;i++)
{
printf("Philosopher %d is thinking\n",i+1);
}
for(i=0;i<N;i++)
}

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\n",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\n",ph_num+1,LEFT+1,ph_num+1);
printf("Philosopher %d is Eating\n",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\n",ph_num+1,LEFT+1,ph_num+1);
printf("Philosopher %d is thinking\n",ph_num+1);
test(LEFT);
test(RIGHT);
sem_post(&mutex);
}
1```

OUTPUT
——-

Philosopher 1 is thinking
Philosopher 2 is thinking
Philosopher 3 is thinking
Philosopher 4 is thinking
Philosopher 5 is thinking
Philosopher 1 is Hungry
Philosopher 1 takes fork 5 and 1
Philosopher 1 is Eating
Philosopher 2 is Hungry
Philosopher 3 is Hungry
Philosopher 3 takes fork 2 and 3
Philosopher 3 is Eating
Philosopher 4 is Hungry
Philosopher 5 is Hungry
Philosopher 1 putting fork 5 and 1 down
Philosopher 1 is thinking
Philosopher 5 takes fork 4 and 5
Philosopher 5 is Eating
Philosopher 3 putting fork 2 and 3 down
Philosopher 3 is thinking

VN:F [1.9.22_1171]
VN:F [1.9.22_1171]
Dining Philosophers Problem, 8.6 out of 10 based on 87 ratings

29. September 2010 by Jishnu
Categories: C Programming, System Programming | Tags: , | 24 comments

1. minta dong file semaphore.h dan pthread.h
kirim ke email ya
thnks

2. quite understandable
Now how can you write this same code in parallel using threads ?? like the dining philosopher problem
Would be grateful to receive the code via my email

3. hi Jishnu,

Thanks a lot for the code…

It will be of great help for me if you could get me the c code for Producer consumer problem

4. thanks boss…..can u get me the code for reader-writer and producer-consumer problem…….

5. thanks

6. Where can i get the Algorithm for this programs

7. Thanks a lot, great code!

8. thanks

9. Thanks…………

10. wow……..beautifull

11. very nice………

12. greattttttt

13. good

14. You made my work easy

17. thanks alot man

18. semaphore.h cant run plz help

19. Ese código es épico!! gracias Jishnu Lo traduje al español, y lo comenté… espero que le sirva a alguien…

that code is awesome!! thanks jishnu i translated it to spanish, and commented it, if anyone is interested

20. It’s wrong :O
THe philosophers eat in order, and Deadlock is not avoidded!
Isn’t this the main objective of this program?

21. chudir pola

22. thanks man, great code…

23. good…..

24. i want explanation …