#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define MAX 100
sem_t forks[ MAX] ;
int numPhilosophers;
void * philosopher( void * arg) {
int id = * ( int * ) arg;
int left = id;
int right = ( id + 1 ) % numPhilosophers;
printf ( "P%d is thinking\n " , id
+ 1 ) ;
sem_wait( & forks[ left] ) ;
printf ( "P%d picked F%d\n " , id
+ 1 , left
+ 1 ) ;
sem_wait( & forks[ right] ) ;
printf ( "P%d picked F%d\n " , id
+ 1 , right
+ 1 ) ;
printf ( "P%d is eating with F%d and F%d\n " , id
+ 1 , left
+ 1 , right
+ 1 ) ;
sem_post( & forks[ left] ) ;
printf ( "P%d released F%d\n " , id
+ 1 , left
+ 1 ) ;
sem_post( & forks[ right] ) ;
printf ( "P%d released F%d\n " , id
+ 1 , right
+ 1 ) ;
return NULL;
}
int main( ) {
scanf ( "%d" , & numPhilosophers
) ; if ( numPhilosophers < 2 || numPhilosophers > MAX) return 1 ;
pthread_t threads[ MAX] ;
int ids[ MAX] ;
for ( int i = 0 ; i < numPhilosophers; i++ )
sem_init( & forks[ i] , 0 , 1 ) ;
for ( int i = 0 ; i < numPhilosophers; i++ ) {
ids[ i] = i;
pthread_create( & threads[ i] , NULL, philosopher, & ids[ i] ) ;
}
for ( int i = 0 ; i < numPhilosophers; i++ )
pthread_join( threads[ i] , NULL) ;
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KCiNkZWZpbmUgTUFYIDEwMAoKc2VtX3QgZm9ya3NbTUFYXTsKaW50IG51bVBoaWxvc29waGVyczsKCnZvaWQqIHBoaWxvc29waGVyKHZvaWQqIGFyZykgewogICAgaW50IGlkID0gKihpbnQqKWFyZzsKICAgIGludCBsZWZ0ID0gaWQ7CiAgICBpbnQgcmlnaHQgPSAoaWQgKyAxKSAlIG51bVBoaWxvc29waGVyczsKCiAgICBwcmludGYoIlAlZCBpcyB0aGlua2luZ1xuIiwgaWQgKyAxKTsKCiAgICBzZW1fd2FpdCgmZm9ya3NbbGVmdF0pOwogICAgcHJpbnRmKCJQJWQgcGlja2VkIEYlZFxuIiwgaWQgKyAxLCBsZWZ0ICsgMSk7CgogICAgc2VtX3dhaXQoJmZvcmtzW3JpZ2h0XSk7CiAgICBwcmludGYoIlAlZCBwaWNrZWQgRiVkXG4iLCBpZCArIDEsIHJpZ2h0ICsgMSk7CgogICAgcHJpbnRmKCJQJWQgaXMgZWF0aW5nIHdpdGggRiVkIGFuZCBGJWRcbiIsIGlkICsgMSwgbGVmdCArIDEsIHJpZ2h0ICsgMSk7CgogICAgc2VtX3Bvc3QoJmZvcmtzW2xlZnRdKTsKICAgIHByaW50ZigiUCVkIHJlbGVhc2VkIEYlZFxuIiwgaWQgKyAxLCBsZWZ0ICsgMSk7CgogICAgc2VtX3Bvc3QoJmZvcmtzW3JpZ2h0XSk7CiAgICBwcmludGYoIlAlZCByZWxlYXNlZCBGJWRcbiIsIGlkICsgMSwgcmlnaHQgKyAxKTsKCiAgICByZXR1cm4gTlVMTDsKfQoKaW50IG1haW4oKSB7CiAgICBzY2FuZigiJWQiLCAmbnVtUGhpbG9zb3BoZXJzKTsKICAgIGlmIChudW1QaGlsb3NvcGhlcnMgPCAyIHx8IG51bVBoaWxvc29waGVycyA+IE1BWCkgcmV0dXJuIDE7CgogICAgcHRocmVhZF90IHRocmVhZHNbTUFYXTsKICAgIGludCBpZHNbTUFYXTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVBoaWxvc29waGVyczsgaSsrKQogICAgICAgIHNlbV9pbml0KCZmb3Jrc1tpXSwgMCwgMSk7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1QaGlsb3NvcGhlcnM7IGkrKykgewogICAgICAgIGlkc1tpXSA9IGk7CiAgICAgICAgcHRocmVhZF9jcmVhdGUoJnRocmVhZHNbaV0sIE5VTEwsIHBoaWxvc29waGVyLCAmaWRzW2ldKTsKICAgIH0KCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVBoaWxvc29waGVyczsgaSsrKQogICAgICAgIHB0aHJlYWRfam9pbih0aHJlYWRzW2ldLCBOVUxMKTsKCiAgICByZXR1cm4gMDsKfQo=