fork download
  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <semaphore.h>
  4. #include <unistd.h>
  5.  
  6. // Define the semaphore and mutex
  7. sem_t room_sem;
  8. sem_t dr_sem;
  9. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  10.  
  11. void* patient(void* arg) {
  12. int id = *(int*)arg;
  13.  
  14. printf("User %d entered room 1\n", id);
  15.  
  16. // Acquire the semaphore to limit the number of patients in room 1
  17. sem_wait(&room_sem);
  18.  
  19. printf("User %d measuring height\n", id);
  20. // Simulating height measurement
  21. sleep(1);
  22. printf("User %d measuring weight\n", id);
  23. // Simulating weight measurement
  24. sleep(1);
  25. printf("User %d leaving room 1\n", id);
  26.  
  27. // Release the semaphore
  28. sem_post(&room_sem);
  29.  
  30. printf("User %d entering Dr. X's chamber\n", id);
  31.  
  32. // Acquire the mutex to ensure only one patient consults with Dr. X at a time
  33. pthread_mutex_lock(&mutex);
  34. printf("User %d consulting with Dr. X\n", id);
  35. // Simulating consultation
  36. sleep(2);
  37. printf("User %d leaving Dr. X's chamber\n", id);
  38. pthread_mutex_unlock(&mutex);
  39.  
  40. return NULL;
  41. }
  42.  
  43. int main() {
  44. int n;
  45. printf("Enter : ");
  46. scanf("%d", &n);
  47.  
  48. pthread_t patients[n];
  49. int ids[n];
  50.  
  51. sem_init(&room_sem, 0, n);
  52. sem_init(&dr_sem, 0, 1);
  53.  
  54. for (int i = 0; i < n; i++) {
  55. ids[i] = i + 1;
  56. pthread_create(&patients[i], NULL, patient, &ids[i]);
  57. }
  58.  
  59. for (int i = 0; i < n; i++) {
  60. pthread_join(patients[i], NULL);
  61. }
  62.  
  63. sem_destroy(&room_sem);
  64. sem_destroy(&dr_sem);
  65. pthread_mutex_destroy(&mutex);
  66.  
  67. return 0;
  68. }
  69.  
Success #stdin #stdout 0.01s 5284KB
stdin
3
stdout
Enter : User 3 entered room 1
User 3 measuring height
User 2 entered room 1
User 2 measuring height
User 1 entered room 1
User 1 measuring height
User 3 measuring weight
User 2 measuring weight
User 1 measuring weight
User 1 leaving room 1
User 1 entering Dr. X's chamber
User 1 consulting with Dr. X
User 2 leaving room 1
User 2 entering Dr. X's chamber
User 3 leaving room 1
User 3 entering Dr. X's chamber
User 1 leaving Dr. X's chamber
User 2 consulting with Dr. X
User 2 leaving Dr. X's chamber
User 3 consulting with Dr. X
User 3 leaving Dr. X's chamber