#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
// Define the semaphore and mutex
sem_t room_sem;
sem_t dr_sem;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void * patient( void * arg) {
int id = * ( int * ) arg;
printf ( "User %d entered room 1\n " , id
) ;
// Acquire the semaphore to limit the number of patients in room 1
sem_wait( & room_sem) ;
printf ( "User %d measuring height\n " , id
) ; // Simulating height measurement
sleep( 1 ) ;
printf ( "User %d measuring weight\n " , id
) ; // Simulating weight measurement
sleep( 1 ) ;
printf ( "User %d leaving room 1\n " , id
) ;
// Release the semaphore
sem_post( & room_sem) ;
printf ( "User %d entering Dr. X's chamber\n " , id
) ;
// Acquire the mutex to ensure only one patient consults with Dr. X at a time
pthread_mutex_lock( & mutex) ;
printf ( "User %d consulting with Dr. X\n " , id
) ; // Simulating consultation
sleep( 2 ) ;
printf ( "User %d leaving Dr. X's chamber\n " , id
) ; pthread_mutex_unlock( & mutex) ;
return NULL;
}
int main( ) {
int n;
pthread_t patients[ n] ;
int ids[ n] ;
sem_init( & room_sem, 0 , n) ;
sem_init( & dr_sem, 0 , 1 ) ;
for ( int i = 0 ; i < n; i++ ) {
ids[ i] = i + 1 ;
pthread_create( & patients[ i] , NULL, patient, & ids[ i] ) ;
}
for ( int i = 0 ; i < n; i++ ) {
pthread_join( patients[ i] , NULL) ;
}
sem_destroy( & room_sem) ;
sem_destroy( & dr_sem) ;
pthread_mutex_destroy( & mutex) ;
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKLy8gRGVmaW5lIHRoZSBzZW1hcGhvcmUgYW5kIG11dGV4CnNlbV90IHJvb21fc2VtOwpzZW1fdCBkcl9zZW07CnB0aHJlYWRfbXV0ZXhfdCBtdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7Cgp2b2lkKiBwYXRpZW50KHZvaWQqIGFyZykgewogICAgaW50IGlkID0gKihpbnQqKWFyZzsKICAgIAogICAgcHJpbnRmKCJVc2VyICVkIGVudGVyZWQgcm9vbSAxXG4iLCBpZCk7CiAgICAKICAgIC8vIEFjcXVpcmUgdGhlIHNlbWFwaG9yZSB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIHBhdGllbnRzIGluIHJvb20gMQogICAgc2VtX3dhaXQoJnJvb21fc2VtKTsKICAgIAogICAgcHJpbnRmKCJVc2VyICVkIG1lYXN1cmluZyBoZWlnaHRcbiIsIGlkKTsKICAgIC8vIFNpbXVsYXRpbmcgaGVpZ2h0IG1lYXN1cmVtZW50CiAgICBzbGVlcCgxKTsKICAgIHByaW50ZigiVXNlciAlZCBtZWFzdXJpbmcgd2VpZ2h0XG4iLCBpZCk7CiAgICAvLyBTaW11bGF0aW5nIHdlaWdodCBtZWFzdXJlbWVudAogICAgc2xlZXAoMSk7CiAgICBwcmludGYoIlVzZXIgJWQgbGVhdmluZyByb29tIDFcbiIsIGlkKTsKICAgIAogICAgLy8gUmVsZWFzZSB0aGUgc2VtYXBob3JlCiAgICBzZW1fcG9zdCgmcm9vbV9zZW0pOwogICAgCiAgICBwcmludGYoIlVzZXIgJWQgZW50ZXJpbmcgRHIuIFgncyBjaGFtYmVyXG4iLCBpZCk7CiAgICAKICAgIC8vIEFjcXVpcmUgdGhlIG11dGV4IHRvIGVuc3VyZSBvbmx5IG9uZSBwYXRpZW50IGNvbnN1bHRzIHdpdGggRHIuIFggYXQgYSB0aW1lCiAgICBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4KTsKICAgIHByaW50ZigiVXNlciAlZCBjb25zdWx0aW5nIHdpdGggRHIuIFhcbiIsIGlkKTsKICAgIC8vIFNpbXVsYXRpbmcgY29uc3VsdGF0aW9uCiAgICBzbGVlcCgyKTsKICAgIHByaW50ZigiVXNlciAlZCBsZWF2aW5nIERyLiBYJ3MgY2hhbWJlclxuIiwgaWQpOwogICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKICAgIAogICAgcmV0dXJuIE5VTEw7Cn0KCmludCBtYWluKCkgewogICAgaW50IG47CiAgICBwcmludGYoIkVudGVyIDogIik7CiAgICBzY2FuZigiJWQiLCAmbik7CiAgICAKICAgIHB0aHJlYWRfdCBwYXRpZW50c1tuXTsKICAgIGludCBpZHNbbl07CiAgICAKICAgIHNlbV9pbml0KCZyb29tX3NlbSwgMCwgbik7CiAgICBzZW1faW5pdCgmZHJfc2VtLCAwLCAxKTsKICAgIAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBpZHNbaV0gPSBpICsgMTsKICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmcGF0aWVudHNbaV0sIE5VTEwsIHBhdGllbnQsICZpZHNbaV0pOwogICAgfQogICAgCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHB0aHJlYWRfam9pbihwYXRpZW50c1tpXSwgTlVMTCk7CiAgICB9CiAgICAKICAgIHNlbV9kZXN0cm95KCZyb29tX3NlbSk7CiAgICBzZW1fZGVzdHJveSgmZHJfc2VtKTsKICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXV0ZXgpOwogICAgCiAgICByZXR1cm4gMDsKfQo=