fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #include <semaphore.h>
  5. #include <unistd.h>
  6.  
  7. sem_t chopsticks[5];
  8.  
  9. void *philos(void *);
  10. void eat(int);
  11.  
  12. int main() {
  13. int n[5], i;
  14. pthread_t T[5];
  15.  
  16. for (i = 0; i < 5; i++) {
  17. sem_init(&chopsticks[i], 0, 1);
  18. }
  19.  
  20. for (i = 0; i < 5; i++) {
  21. n[i] = i;
  22. pthread_create(&T[i], NULL, philos, (void *)&n[i]);
  23. }
  24.  
  25. for (i = 0; i < 5; i++) {
  26. pthread_join(T[i], NULL);
  27. }
  28.  
  29. return 0;
  30. }
  31.  
  32. void *philos(void *n) {
  33. int ph = *(int *)n;
  34.  
  35. printf("Philosopher %d wants to eat\n", ph);
  36.  
  37. // To avoid deadlock: odd philosophers pick right first
  38. if (ph % 2 == 0) {
  39. printf("Philosopher %d tries to pick up left chopstick\n", ph);
  40. sem_wait(&chopsticks[ph]);
  41. printf("Philosopher %d picks left chopstick\n", ph);
  42.  
  43. printf("Philosopher %d tries to pick up right chopstick\n", ph);
  44. sem_wait(&chopsticks[(ph + 1) % 5]);
  45. printf("Philosopher %d picks right chopstick\n", ph);
  46. } else {
  47. printf("Philosopher %d tries to pick up right chopstick\n", ph);
  48. sem_wait(&chopsticks[(ph + 1) % 5]);
  49. printf("Philosopher %d picks right chopstick\n", ph);
  50.  
  51. printf("Philosopher %d tries to pick up left chopstick\n", ph);
  52. sem_wait(&chopsticks[ph]);
  53. printf("Philosopher %d picks left chopstick\n", ph);
  54. }
  55.  
  56. eat(ph);
  57. sleep(2);
  58.  
  59. printf("Philosopher %d finished eating\n", ph);
  60.  
  61. sem_post(&chopsticks[(ph + 1) % 5]);
  62. printf("Philosopher %d puts down right chopstick\n", ph);
  63.  
  64. sem_post(&chopsticks[ph]);
  65. printf("Philosopher %d puts down left chopstick\n", ph);
  66.  
  67. return NULL;
  68. }
  69.  
  70. void eat(int ph) {
  71. printf("Philosopher %d starts eating...\n", ph);
  72. }
  73.  
Success #stdin #stdout 0.01s 5320KB
stdin
Standard input is empty
stdout
Philosopher 4 wants to eat
Philosopher 4 tries to pick up left chopstick
Philosopher 4 picks left chopstick
Philosopher 4 tries to pick up right chopstick
Philosopher 4 picks right chopstick
Philosopher 4 starts eating...
Philosopher 3 wants to eat
Philosopher 3 tries to pick up right chopstick
Philosopher 2 wants to eat
Philosopher 2 tries to pick up left chopstick
Philosopher 2 picks left chopstick
Philosopher 2 tries to pick up right chopstick
Philosopher 2 picks right chopstick
Philosopher 2 starts eating...
Philosopher 1 wants to eat
Philosopher 1 tries to pick up right chopstick
Philosopher 0 wants to eat
Philosopher 0 tries to pick up left chopstick
Philosopher 4 finished eating
Philosopher 4 puts down right chopstick
Philosopher 4 puts down left chopstick
Philosopher 2 finished eating
Philosopher 2 puts down right chopstick
Philosopher 2 puts down left chopstick
Philosopher 0 picks left chopstick
Philosopher 0 tries to pick up right chopstick
Philosopher 0 picks right chopstick
Philosopher 0 starts eating...
Philosopher 3 picks right chopstick
Philosopher 3 tries to pick up left chopstick
Philosopher 3 picks left chopstick
Philosopher 3 starts eating...
Philosopher 1 picks right chopstick
Philosopher 1 tries to pick up left chopstick
Philosopher 0 finished eating
Philosopher 0 puts down right chopstick
Philosopher 0 puts down left chopstick
Philosopher 3 finished eating
Philosopher 3 puts down right chopstick
Philosopher 3 puts down left chopstick
Philosopher 1 picks left chopstick
Philosopher 1 starts eating...
Philosopher 1 finished eating
Philosopher 1 puts down right chopstick
Philosopher 1 puts down left chopstick