Thursday 21 March 2013

dinning problem


#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.