fork download
  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <semaphore.h>
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #include <ctype.h>
  7. #include <time.h>
  8. #include <unistd.h>
  9.  
  10. char q[10];
  11. int number = 5,buffer = 0;
  12. sem_t fullsem, emptysem, producerSync, producerSync1, consumerSync, consumerSync1;
  13.  
  14. void producerPrinting(int i, char tmp, int p) {
  15. printf("\nProducer#%d at i=%d : Inserted %c , buffer: %d", p, i, tmp, buffer);
  16. }
  17.  
  18. char generateChar() {
  19. sleep(1);
  20. srand(time(NULL));
  21. return 'a' + ((rand() * 100) % 26);
  22. }
  23.  
  24. void consumerProcess(char *tmp) { *tmp = toupper(*tmp); }
  25.  
  26. void consumerPrinting(int i, char tmp, int c) {
  27. printf("\nConsumer#%d at i=%d: Getting %c, buffer:%d", c, i, tmp, buffer);
  28. }
  29.  
  30. void consumerRead(char *tmp) { *tmp= q[--buffer]; }
  31. void insert(char e) {
  32. if (buffer < number)
  33. q[buffer++] = e;
  34. else
  35. buffer = 0;
  36. }
  37.  
  38.  
  39. void *produce(void *a) {
  40. int i;
  41. for (i = 0; i < number * 2; i++) {
  42. sem_wait(&fullsem);
  43. sem_wait(&producerSync1);
  44.  
  45. char tmp = generateChar();
  46. insert(tmp);
  47. producerPrinting(i, tmp, 1);
  48.  
  49. sem_post(&emptysem);
  50. sem_post(&producerSync);
  51. }
  52. }
  53.  
  54.  
  55.  
  56. void *produce2(void *a) {
  57. int i;
  58. for (i = 0; i < number * 2; i++) {
  59. sem_wait(&fullsem);
  60. sem_wait(&producerSync);
  61. char tmp = generateChar();
  62. insert(tmp);
  63. producerPrinting(i, tmp, 2);
  64.  
  65. sem_post(&emptysem);
  66. sem_post(&producerSync1);
  67.  
  68. }
  69. }
  70.  
  71. void *consume(void *a) {
  72. int i;
  73. for (i = 0; i < number * 2; i++) {
  74.  
  75. sem_wait(&emptysem);
  76. sem_wait(&consumerSync1);
  77. char tmp;
  78. consumerRead(&tmp);
  79. consumerProcess(&tmp);
  80. consumerPrinting(i, tmp, 1);
  81.  
  82. sem_post(&fullsem);
  83. sem_post(&consumerSync);
  84. }
  85.  
  86.  
  87. }
  88.  
  89.  
  90.  
  91. void *consume2(void *a) {
  92. int i, v;
  93. for (i = 0; i < number * 2; i++) {
  94.  
  95. sem_wait(&emptysem);
  96. sem_wait(&consumerSync);
  97.  
  98. char tmp;
  99. consumerRead(&tmp);
  100. consumerProcess(&tmp);
  101. consumerPrinting(i, tmp, 2);
  102.  
  103. sem_post(&fullsem);
  104. sem_post(&consumerSync1);
  105.  
  106. }
  107.  
  108.  
  109. }
  110.  
  111. int main() {
  112. pthread_t t[4];
  113. sem_init(&fullsem, 0, 10);
  114. sem_init(&emptysem, 0, 0);
  115. sem_init(&producerSync, 0, 0);
  116. sem_init(&producerSync1, 0, 1);
  117. sem_init(&consumerSync, 0, 1);
  118. sem_init(&consumerSync1, 0, 1);
  119.  
  120. pthread_create(&t[0], NULL, &produce, NULL);
  121. pthread_create(&t[1], NULL, &produce2, NULL);
  122.  
  123. pthread_create(&t[2], NULL, &consume, NULL);
  124.  
  125.  
  126. pthread_create(&t[3], NULL, &consume2, NULL);
  127.  
  128. pthread_join(t[0], NULL);
  129. pthread_join(t[1], NULL);
  130. pthread_join(t[2], NULL);
  131. pthread_join(t[3], NULL);
  132. sem_destroy(&fullsem);
  133. sem_destroy(&emptysem);
  134. sem_destroy(&consumerSync);
  135. sem_destroy(&consumerSync1);
  136. sem_destroy(&producerSync);
  137. sem_destroy(&producerSync1);
  138.  
  139.  
  140. return 0;
  141. }
Success #stdin #stdout 0s 35064KB
stdin
Standard input is empty
stdout
Producer#1 at i=0 : Inserted i , buffer: 1
Consumer#2 at i=0: Getting I, buffer:0
Producer#2 at i=0 : Inserted a , buffer: 1
Consumer#1 at i=0: Getting A, buffer:0
Producer#1 at i=1 : Inserted O , buffer: 1
Consumer#2 at i=1: Getting O, buffer:0
Producer#2 at i=1 : Inserted w , buffer: 1
Consumer#1 at i=1: Getting W, buffer:0
Producer#1 at i=2 : Inserted Q , buffer: 1
Consumer#2 at i=2: Getting Q, buffer:0
Producer#2 at i=2 : Inserted u , buffer: 1
Consumer#1 at i=2: Getting U, buffer:0
Producer#1 at i=3 : Inserted Q , buffer: 1
Consumer#2 at i=3: Getting Q, buffer:0
Producer#2 at i=3 : Inserted I , buffer: 1
Consumer#1 at i=3: Getting I, buffer:0
Producer#1 at i=4 : Inserted g , buffer: 1
Consumer#2 at i=4: Getting G, buffer:0
Producer#2 at i=4 : Inserted a , buffer: 1
Consumer#1 at i=4: Getting A, buffer:0
Producer#1 at i=5 : Inserted s , buffer: 1
Consumer#2 at i=5: Getting S, buffer:0
Producer#2 at i=5 : Inserted o , buffer: 1
Consumer#1 at i=5: Getting O, buffer:0
Producer#1 at i=6 : Inserted e , buffer: 1
Consumer#2 at i=6: Getting E, buffer:0
Producer#2 at i=6 : Inserted U , buffer: 1
Consumer#1 at i=6: Getting U, buffer:0
Producer#1 at i=7 : Inserted ] , buffer: 1
Consumer#2 at i=7: Getting ], buffer:0
Producer#2 at i=7 : Inserted U , buffer: 1
Consumer#1 at i=7: Getting U, buffer:0
Producer#1 at i=8 : Inserted K , buffer: 1
Consumer#2 at i=8: Getting K, buffer:0
Producer#2 at i=8 : Inserted a , buffer: 1
Consumer#1 at i=8: Getting A, buffer:0
Producer#1 at i=9 : Inserted [ , buffer: 1
Consumer#2 at i=9: Getting [, buffer:0
Producer#2 at i=9 : Inserted i , buffer: 1
Consumer#1 at i=9: Getting I, buffer:0