fork(1) download
  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <semaphore.h>
  4. #include <unistd.h>
  5. sem_t mutex, wrt;
  6. int readcount = 0;
  7. int data = 0;
  8. void* reader(void* arg)
  9. {
  10. int id = *(int*)arg;
  11. sem_wait(&mutex);
  12. readcount++;
  13. if(readcount == 1)
  14. sem_wait(&wrt);
  15. sem_post(&mutex);
  16. printf("Reader %d reads data = %d\n", id, data);
  17. sleep(1);
  18. sem_wait(&mutex);
  19. readcount--;
  20. if(readcount == 0)
  21. sem_post(&wrt);
  22. sem_post(&mutex);
  23. return NULL;
  24. }
  25. void* writer(void* arg)
  26. {
  27. int id = *(int*)arg;
  28. sem_wait(&wrt);
  29. data++;
  30. printf("Writer %d writes data = %d\n", id, data);
  31. sleep(1);
  32. sem_post(&wrt);
  33. return NULL;
  34. }
  35. int main()
  36. {
  37. pthread_t r[3], w[2];
  38. int r_id[3] = {1,2,3};
  39. int w_id[2] = {1,2};
  40. sem_init(&mutex, 0, 1);
  41. sem_init(&wrt, 0, 1);
  42. for(int i = 0; i < 3; i++)
  43. pthread_create(&r[i], NULL, reader, &r_id[i]);
  44. for(int i = 0; i < 2; i++)
  45. pthread_create(&w[i], NULL, writer, &w_id[i]);
  46. for(int i = 0; i < 3; i++)
  47. pthread_join(r[i], NULL);
  48. for(int i = 0; i < 2; i++)
  49. pthread_join(w[i], NULL);
  50. sem_destroy(&mutex);
  51. sem_destroy(&wrt);
  52.  
  53. return 0;
  54. }
Success #stdin #stdout 0s 5284KB
stdin
Standard input is empty
stdout
Writer 2 writes data = 1
Writer 1 writes data = 2
Reader 3 reads data = 2
Reader 2 reads data = 2
Reader 1 reads data = 2