fork(1) download
  1. #include<semaphore.h>
  2.  
  3. #include<pthread.h>
  4.  
  5. #include<stdio.h>
  6.  
  7.  
  8. int rc=0,wc=0,val;
  9.  
  10. pthread_mutex_t mutex1,mwrite,mread,rallow;
  11.  
  12. pthread_t tr1,tr2,tw1,tw2;
  13.  
  14. pthread_attr_t tr1attr,tr2attr,tw1attr,tw2attr;
  15. /* visit www.rpv.tk for more */
  16.  
  17. void *writer();
  18.  
  19. void *reader();
  20.  
  21.  
  22. int main()
  23.  
  24. {
  25.  
  26. pthread_mutex_init(&mwrite,NULL);
  27.  
  28. pthread_mutex_init(&mread,NULL);
  29.  
  30. pthread_mutex_init(&rallow,NULL);
  31.  
  32. pthread_mutex_init(&mutex1,NULL);
  33.  
  34.  
  35. pthread_attr_init(&tw1attr);
  36.  
  37. pthread_attr_init(&tr1attr);
  38.  
  39. pthread_attr_init(&tr2attr);
  40.  
  41. pthread_attr_init(&tw2attr);
  42.  
  43.  
  44. printf("\n Writer 1 created");
  45.  
  46. pthread_create(&tw1,&tw1attr,writer,NULL);
  47.  
  48. printf("\n Reader 1 created");
  49.  
  50.  
  51. pthread_create(&tr1,&tr1attr,reader,NULL);
  52.  
  53. printf("\n Reader 2 created");
  54.  
  55. pthread_create(&tr2,&tr2attr,reader,NULL);
  56.  
  57. printf("\n WRITER 2 created");
  58.  
  59. pthread_create(&tw2,&tw2attr,writer,NULL);
  60.  
  61.  
  62. pthread_join(tw1,NULL);
  63.  
  64. pthread_join(tr1,NULL);
  65.  
  66. pthread_join(tr2,NULL);
  67.  
  68. pthread_join(tw2,NULL);
  69. /* Aditya Jain */
  70.  
  71. return 0;
  72.  
  73. }
  74.  
  75.  
  76. void *writer()
  77.  
  78. {
  79.  
  80. pthread_mutex_lock(&mwrite);
  81.  
  82. wc++;
  83.  
  84. if(wc==1)
  85.  
  86. pthread_mutex_lock(&rallow);
  87.  
  88. pthread_mutex_unlock(&mwrite);
  89.  
  90.  
  91. pthread_mutex_lock(&mutex1);
  92.  
  93. printf("\n Enter data in writer %d",wc);
  94.  
  95. scanf("%d",&val);
  96.  
  97. pthread_mutex_unlock(&mutex1);
  98.  
  99.  
  100. pthread_mutex_lock(&mwrite);
  101.  
  102. wc--;
  103.  
  104. if(wc==0)
  105.  
  106. pthread_mutex_unlock(&rallow);
  107.  
  108. pthread_mutex_unlock(&mwrite);
  109.  
  110. pthread_exit(0);
  111.  
  112. }
  113.  
  114.  
  115. void *reader()
  116.  
  117. {
  118.  
  119. pthread_mutex_lock(&rallow);
  120.  
  121. pthread_mutex_lock(&mread);
  122.  
  123. rc++;
  124.  
  125. if(rc==1)
  126.  
  127. pthread_mutex_lock(&mutex1);
  128.  
  129. pthread_mutex_unlock(&mread);
  130.  
  131. pthread_mutex_unlock(&rallow);
  132.  
  133.  
  134. printf("\n reader %d read data: %d",rc,val);
  135.  
  136.  
  137. pthread_mutex_lock(&mread);
  138.  
  139. rc--;
  140.  
  141. if(rc==0)
  142.  
  143. pthread_mutex_unlock(&mutex1);
  144.  
  145. pthread_mutex_unlock(&mread);
  146.  
  147. pthread_exit(0);
  148.  
  149. }
Success #stdin #stdout 0s 85312KB
stdin
2
1
stdout
 Writer 1 created
 Reader 1 created
 Reader 2 created
 WRITER 2 created
 Enter data in writer 1
 reader 1 read data: 2
 reader 1 read data: 2
 Enter data in writer 1