#include <stdio.h>
#include <semaphore.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#define NUM_PHILOSOPHERS 3
sem_t chopsticks[ NUM_PHILOSOPHERS] ;
void * philosopher( void * arg) ;
int main( ) {
pthread_t t[ NUM_PHILOSOPHERS] ;
// Initialize semaphores (chopsticks)
for ( int i = 0 ; i < NUM_PHILOSOPHERS; i++ ) {
sem_init( & chopsticks[ i] , 0 , 1 ) ; // Initialize each chopstick to 1 (unlocked)
}
// Create philosopher threads
for ( int i = 0 ; i < NUM_PHILOSOPHERS; i++ ) {
int * p
= ( int * ) malloc ( sizeof ( int ) ) ; * p = i;
pthread_create( & t[ i] , NULL, philosopher, ( void * ) p) ;
}
// Join philosopher threads
for ( int i = 0 ; i < NUM_PHILOSOPHERS; i++ ) {
pthread_join( t[ i] , NULL) ;
}
// Destroy semaphores
return 0 ;
}
void * philosopher( void * arg) {
int id = * ( int * ) arg;
free ( arg
) ; // Free allocated memory for philosopher ID
printf ( "Philosopher %d is thinking\n " , id
) ; sleep( 1 ) ;
printf ( "Philosopher %d wants to eat\n " , id
) ;
sem_wait( & chopsticks[ id] ) ; // Pick up left chopstick
sem_wait( & chopsticks[ ( id + 1 ) % NUM_PHILOSOPHERS] ) ; // Pick up right chopstick
printf ( "Philosopher %d is eating\n " , id
) ; sleep( 2 ) ; // Simulate eating
sem_post( & chopsticks[ ( id + 1 ) % NUM_PHILOSOPHERS] ) ; // Release right chopstick
sem_post( & chopsticks[ id] ) ; // Release left chopstick
printf ( "Philosopher %d stops eating and came back to thinking state\n " , id
) ;
return NULL;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KI2luY2x1ZGUgPHB0aHJlYWQuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgojZGVmaW5lIE5VTV9QSElMT1NPUEhFUlMgMwoKc2VtX3QgY2hvcHN0aWNrc1tOVU1fUEhJTE9TT1BIRVJTXTsKCnZvaWQgKnBoaWxvc29waGVyKHZvaWQgKmFyZyk7CgppbnQgbWFpbigpIHsKICAgIHB0aHJlYWRfdCB0W05VTV9QSElMT1NPUEhFUlNdOwoKICAgIC8vIEluaXRpYWxpemUgc2VtYXBob3JlcyAoY2hvcHN0aWNrcykKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1BISUxPU09QSEVSUzsgaSsrKSB7CiAgICAgICAgc2VtX2luaXQoJmNob3BzdGlja3NbaV0sIDAsIDEpOyAvLyBJbml0aWFsaXplIGVhY2ggY2hvcHN0aWNrIHRvIDEgKHVubG9ja2VkKQogICAgfQoKICAgIC8vIENyZWF0ZSBwaGlsb3NvcGhlciB0aHJlYWRzCiAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9QSElMT1NPUEhFUlM7IGkrKykgewogICAgICAgIGludCAqcCA9IChpbnQgKiltYWxsb2Moc2l6ZW9mKGludCkpOwogICAgICAgICpwID0gaTsKICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmdFtpXSwgTlVMTCwgcGhpbG9zb3BoZXIsICh2b2lkICopcCk7CiAgICB9CgogICAgLy8gSm9pbiBwaGlsb3NvcGhlciB0aHJlYWRzCiAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9QSElMT1NPUEhFUlM7IGkrKykgewogICAgICAgIHB0aHJlYWRfam9pbih0W2ldLCBOVUxMKTsKICAgIH0KCiAgICAvLyBEZXN0cm95IHNlbWFwaG9yZXMKICAgIAoKICAgIHJldHVybiAwOwp9Cgp2b2lkICpwaGlsb3NvcGhlcih2b2lkICphcmcpIHsKICAgIGludCBpZCA9ICooaW50ICopYXJnOwogICAgZnJlZShhcmcpOyAvLyBGcmVlIGFsbG9jYXRlZCBtZW1vcnkgZm9yIHBoaWxvc29waGVyIElECgogICAgcHJpbnRmKCJQaGlsb3NvcGhlciAlZCBpcyB0aGlua2luZ1xuIiwgaWQpOwogICAgc2xlZXAoMSk7CgogICAgcHJpbnRmKCJQaGlsb3NvcGhlciAlZCB3YW50cyB0byBlYXRcbiIsIGlkKTsKCiAgICBzZW1fd2FpdCgmY2hvcHN0aWNrc1tpZF0pOyAgICAgICAgICAgICAgICAgIC8vIFBpY2sgdXAgbGVmdCBjaG9wc3RpY2sKICAgIHNlbV93YWl0KCZjaG9wc3RpY2tzWyhpZCArIDEpICUgTlVNX1BISUxPU09QSEVSU10pOyAvLyBQaWNrIHVwIHJpZ2h0IGNob3BzdGljawoKICAgIHByaW50ZigiUGhpbG9zb3BoZXIgJWQgaXMgZWF0aW5nXG4iLCBpZCk7CiAgICBzbGVlcCgyKTsgLy8gU2ltdWxhdGUgZWF0aW5nCgogICAgc2VtX3Bvc3QoJmNob3BzdGlja3NbKGlkICsgMSkgJSBOVU1fUEhJTE9TT1BIRVJTXSk7IC8vIFJlbGVhc2UgcmlnaHQgY2hvcHN0aWNrCiAgICBzZW1fcG9zdCgmY2hvcHN0aWNrc1tpZF0pOyAgICAgICAgICAgICAgICAgIC8vIFJlbGVhc2UgbGVmdCBjaG9wc3RpY2sKCiAgICBwcmludGYoIlBoaWxvc29waGVyICVkIHN0b3BzIGVhdGluZyBhbmQgY2FtZSBiYWNrIHRvIHRoaW5raW5nIHN0YXRlXG4iLCBpZCk7CgogICAgcmV0dXJuIE5VTEw7Cn0K