Monday, 21 October 2013

Dining

#include<stdio.h>
#include<semaphore.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
#define sz 5
sem_t chop[sz];
void *right(void *i)
  {
     int *j,k;
     j=(int *)i;
     k=*j;
     while(1)
       {
         printf("\n Philosopher %d is Thinking :",k);
         sleep(3);
         printf("\n Philosopher %d is waiting for chop :",k);
         sem_wait(&chop[k]);                                            //right
         sem_wait(&chop[(k+1)%5]);                    //left
         printf("\n Philosopher %d is Eating:",k);
         sleep(3);
         printf(" \n philosopher %d finished  Eating :",k);
         sem_post(&chop[(k+1)%5]);                    //left
         sem_post(&chop[k]);                        //right
       }
  }

void *left(void *i)
  {
     int *j,k;
     j=(int *)i;
     k=*j;
     while(1)
       {
         printf("\n Philosopher %d is Thinking :",k);
         sleep(3);
         printf("\n Philosopher %d is waiting for chop :",k);
         sem_wait(&chop[(k+1)%5]);                    //left
         sem_wait(&chop[k]);                        //right
         printf("\n Philosopher %d is Eating:",k);
         sleep(3);
         printf(" \n philosopher %d finished  Eating :",k);
         sem_post(&chop[k]);                        //right
         sem_post(&chop[(k+1)%5]);                    //left
       }
  }

void main()
  {
     int i,pno[sz]={0,1,2,3,4};
     pthread_t l1,r1,l2,r2,l3;
     for(i=0;i<sz;i++)
       sem_init(&chop[i],0,1);
    
     pthread_create(&l1,NULL,left,(void *)&pno[0]);
     pthread_create(&r1,NULL,right,(void *)&pno[1]);
     pthread_create(&l2,NULL,left,(void *)&pno[2]);
     pthread_create(&r2,NULL,right,(void *)&pno[3]);
     pthread_create(&l3,NULL,left,(void *)&pno[4]);
    
     pthread_join(l1,NULL);
     pthread_join(l2,NULL);
     pthread_join(l3,NULL);
     pthread_join(r1,NULL);
     pthread_join(r2,NULL);
  }

No comments:

Post a Comment