Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<semaphore.h>
- #include<pthread.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}, feast =0;
- 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);
- return 0;
- }
- void *philospher(void *num)
- {
- int j=0;
- while(j < 10)
- {
- 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);
- test(LEFT);
- test(RIGHT);
- 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);
- sem_post(&mutex);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement