#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
sem_t room;
sem_t chopstick[ 5 ] ;
void * philosopher( void * ) ;
void eat( int ) ;
int main( )
{
int i, a[ 5 ] ;
pthread_t tid[ 5 ] ;
sem_init( & room, 0 , 4 ) ;
for ( i= 0 ; i< 5 ; i++ ) {
sem_init( & chopstick[ i] , 0 , 1 ) ;
}
for ( i= 0 ; i< 5 ; i++ ) {
a[ i] = i;
pthread_create( & tid[ i] , NULL, philosopher, ( void * ) & a[ i] ) ;
}
for ( i= 0 ; i< 5 ; i++ ) {
pthread_join( tid[ i] , NULL) ;
}
return 0 ;
}
void * philosopher( void * num)
{
int phil=* ( int * ) num;
sem_wait( & room) ;
printf ( "\n Philosopher %d has entered room" , phil
) ; sem_wait( & chopstick[ phil] ) ;
sem_wait( & chopstick[ ( phil+ 1 ) % 5 ] ) ;
eat( phil) ;
sleep( 2 ) ;
printf ( "\n Philosopher %d has finished eating" , phil
) ;
sem_post( & chopstick[ ( phil+ 1 ) % 5 ] ) ;
sem_post( & chopstick[ phil] ) ;
sem_post( & room) ;
}
void eat( int phil)
{
printf ( "\n Philosopher %d is eating" , phil
) ; }
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHB0aHJlYWQuaD4KI2luY2x1ZGUgPHNlbWFwaG9yZS5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgpzZW1fdCByb29tOwpzZW1fdCBjaG9wc3RpY2tbNV07Cgp2b2lkICogcGhpbG9zb3BoZXIodm9pZCAqKTsKdm9pZCBlYXQoaW50KTsKaW50IG1haW4oKQp7CglpbnQgaSxhWzVdOwoJcHRocmVhZF90IHRpZFs1XTsKCQoJc2VtX2luaXQoJnJvb20sMCw0KTsKCQoJZm9yKGk9MDtpPDU7aSsrKXsKCQlzZW1faW5pdCgmY2hvcHN0aWNrW2ldLDAsMSk7Cgl9CgkJCglmb3IoaT0wO2k8NTtpKyspewoJCWFbaV09aTsKCQlwdGhyZWFkX2NyZWF0ZSgmdGlkW2ldLE5VTEwscGhpbG9zb3BoZXIsKHZvaWQgKikmYVtpXSk7Cgl9Cglmb3IoaT0wO2k8NTtpKyspewoJCXB0aHJlYWRfam9pbih0aWRbaV0sTlVMTCk7Cgl9CglyZXR1cm4gMDsKfQoKdm9pZCAqIHBoaWxvc29waGVyKHZvaWQgKiBudW0pCnsKCWludCBwaGlsPSooaW50ICopbnVtOwoKCXNlbV93YWl0KCZyb29tKTsKCXByaW50ZigiXG5QaGlsb3NvcGhlciAlZCBoYXMgZW50ZXJlZCByb29tIixwaGlsKTsKCXNlbV93YWl0KCZjaG9wc3RpY2tbcGhpbF0pOwoJc2VtX3dhaXQoJmNob3BzdGlja1socGhpbCsxKSU1XSk7CgoJZWF0KHBoaWwpOwoJc2xlZXAoMik7CglwcmludGYoIlxuUGhpbG9zb3BoZXIgJWQgaGFzIGZpbmlzaGVkIGVhdGluZyIscGhpbCk7CgoJc2VtX3Bvc3QoJmNob3BzdGlja1socGhpbCsxKSU1XSk7CglzZW1fcG9zdCgmY2hvcHN0aWNrW3BoaWxdKTsKCXNlbV9wb3N0KCZyb29tKTsKfQoKdm9pZCBlYXQoaW50IHBoaWwpCnsKCXByaW50ZigiXG5QaGlsb3NvcGhlciAlZCBpcyBlYXRpbmciLHBoaWwpOwp9