#include<stdio.h>
#include<semaphore.h>
#include<pthread.h>
#define N 5 /*Number of philosphers*/
#define THINKING 0 /*Philospher is thinking*/
#define HUNGRY 1 /*Philospher is trying to get forks*/
#define EATING 2 /*Philospher is eating*/
#define LEFT (ph_num+4)%N /*Number of left neighbor*/
#define RIGHT (ph_num+1)%N /*Number of right neighbor*/
sem_t mutex;
sem_t S[N]; /*Array to keep track of everyone's state*/
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\n",i+1);
}
for(i=0;i<N;i++)
pthread_join(thread_id[i],NULL);
}
void *philospher(void *num) /* num: philospher's number from 0 to N-1*/
{
while(1) /*repeat forever*/
{
int *i = num;
sleep(1); /* philospher is thinking*/
take_fork(*i); /*aquire forks or block*/
sleep(0); /*Philospher is eating*/
put_fork(*i); /*put both forks back on table*/
}
}
void take_fork(int ph_num) /* ph_num: philospher's number from 0 to N-1*/
{
sem_wait(&mutex); /*enter critical section*/
state[ph_num] = HUNGRY; /* State is philospher is hungry*/
printf("Philosopher %d is Hungry\n",ph_num+1);
test(ph_num); /*try to aquire two forks*/
sem_post(&mutex); /* exit crtical section*/
sem_wait(&S[ph_num]); /*block if forks were not aquired*/
sleep(1);
}
void test(int ph_num) /* ph_num: philospher's number from 0 to N-1*/
{
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) /* ph_num: philospher's number from 0 to N-1*/
{
sem_wait(&mutex); /*enter critical section*/
state[ph_num] = THINKING; /*philospher has finished eating*/
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); /*see if left neighbor can now eat*/
test(RIGHT); /*see if right neighbor can now eat*/
sem_post(&mutex); /* exit crtical section*/
}
No comments:
Post a Comment
Have some problem with this code? or Request the code you want if you cant find it in Blog Archive.