#include<stdio.h>
#include<semaphore.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
sem_t chopsticks[ 3 ] ;
void * philosopher( void * arg) ;
int main( ) {
pthread_t t[ 3 ] ;
for ( int i= 0 ; i< 3 ; i++ ) {
sem_init( & chopsticks[ i] , 0 , 1 ) ;
}
for ( int i= 0 ; i< 3 ; i++ ) {
int * p
= ( int * ) malloc ( sizeof ( int ) ) ; * p= i;
pthread_create( & t[ i] , NULL, philosopher, p) ;
}
for ( int i= 0 ; i< 3 ; i++ ) {
pthread_join( t[ i] , NULL) ;
}
return 0 ;
}
void * philosopher( void * arg) {
int id=* ( int * ) arg;
printf ( "Philosopher %d is thinking\n " , id
) ; sleep( 1 ) ;
printf ( "Philosopher %d wants to eat\n " , id
) ; sem_wait( & chopsticks[ id] ) ;
sem_wait( & chopsticks[ ( id+ 1 ) % 3 ] ) ;
printf ( "Philosopher %d is eating\n " , id
) ; sleep( 2 ) ;
printf ( "Philosopher %d stops eating and came back to thinking state\n " , id
) ; sem_post( & chopsticks[ ( id+ 1 ) % 3 ] ) ;
sem_post( & chopsticks[ id] ) ;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c2VtYXBob3JlLmg+CiNpbmNsdWRlPHB0aHJlYWQuaD4KI2luY2x1ZGU8dW5pc3RkLmg+CiNpbmNsdWRlPHN0ZGxpYi5oPgpzZW1fdCBjaG9wc3RpY2tzWzNdOwp2b2lkICpwaGlsb3NvcGhlcih2b2lkICphcmcpOwppbnQgbWFpbigpewogICAgcHRocmVhZF90IHRbM107CiAgICBmb3IoaW50IGk9MDtpPDM7aSsrKXsKICAgICAgICBzZW1faW5pdCgmY2hvcHN0aWNrc1tpXSwwLDEpOwogICAgfQogICAgZm9yKGludCBpPTA7aTwzO2krKyl7CiAgICAgICAgaW50ICpwPShpbnQgKiltYWxsb2Moc2l6ZW9mKGludCkpOwogICAgICAgICpwPWk7CiAgICAgICAgcHRocmVhZF9jcmVhdGUoJnRbaV0sTlVMTCxwaGlsb3NvcGhlcixwKTsKICAgIH0KICAgIGZvcihpbnQgaT0wO2k8MztpKyspewogICAgICAgIHB0aHJlYWRfam9pbih0W2ldLE5VTEwpOwogICAgfQogICAgcmV0dXJuIDA7Cn0Kdm9pZCAqcGhpbG9zb3BoZXIodm9pZCAqYXJnKXsKICAgIGludCBpZD0qKGludCAqKWFyZzsKICAgIHByaW50ZigiUGhpbG9zb3BoZXIgJWQgaXMgdGhpbmtpbmdcbiIsIGlkKTsKICAgIHNsZWVwKDEpOwogICAgcHJpbnRmKCJQaGlsb3NvcGhlciAlZCB3YW50cyB0byBlYXRcbiIsIGlkKTsKICAgIHNlbV93YWl0KCZjaG9wc3RpY2tzW2lkXSk7CiAgICBzZW1fd2FpdCgmY2hvcHN0aWNrc1soaWQrMSklM10pOwogICAgcHJpbnRmKCJQaGlsb3NvcGhlciAlZCBpcyBlYXRpbmdcbiIsIGlkKTsKICAgIHNsZWVwKDIpOwogICAgcHJpbnRmKCJQaGlsb3NvcGhlciAlZCBzdG9wcyBlYXRpbmcgYW5kIGNhbWUgYmFjayB0byB0aGlua2luZyBzdGF0ZVxuIiwgaWQpOwogICAgc2VtX3Bvc3QoJmNob3BzdGlja3NbKGlkKzEpJTNdKTsKICAgIHNlbV9wb3N0KCZjaG9wc3RpY2tzW2lkXSk7Cn0=