fork(1) 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 queueOfChars[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 = queueOfChars[--buffer]; }
  31.  
  32. void insert(char e) {
  33. if (buffer < number)
  34. queueOfChars[buffer++] = e;
  35. else
  36. buffer = 0;
  37. }
  38.  
  39.  
  40. void *produce(void *a) {
  41. int i;
  42. for (i = 0; i < number * 2; i++) {
  43. sem_wait(&fullsem);
  44. sem_wait(&producerSync1);
  45.  
  46. char tmp = generateChar();
  47. insert(tmp);
  48. producerPrinting(i, tmp, 1);
  49. if (buffer > number - 1) {
  50. for (int j = 0; j < number; ++j) {
  51. sem_post(&emptysem);
  52. }
  53. }
  54.  
  55. sem_post(&producerSync);
  56. }
  57. }
  58.  
  59.  
  60. void *produce2(void *a) {
  61. int i;
  62. for (i = 0; i < number * 2; i++) {
  63. sem_wait(&fullsem);
  64. sem_wait(&producerSync);
  65. char tmp = generateChar();
  66. insert(tmp);
  67. producerPrinting(i, tmp, 2);
  68. if (buffer > number - 1) {
  69. for (int j = 0; j < number; ++j) {
  70. sem_post(&emptysem);
  71. }
  72. }
  73.  
  74. sem_post(&producerSync1);
  75.  
  76. }
  77. }
  78.  
  79. void *consume(void *a) {
  80. int i;
  81. for (i = 0; i < number * 2; i++) {
  82. sem_wait(&emptysem);
  83. sem_wait(&consumerSync1);
  84. char tmp;
  85. consumerRead(&tmp);
  86. consumerProcess(&tmp);
  87. consumerPrinting(i, tmp, 1);
  88. if (buffer == 0) {
  89. for (int j = 0; j < number; ++j) {
  90. sem_post(&fullsem);
  91. }
  92. }
  93. sem_post(&consumerSync);
  94. }
  95.  
  96.  
  97. }
  98.  
  99.  
  100. void *consume2(void *a) {
  101. int i, v;
  102. for (i = 0; i < number * 2; i++) {
  103. sem_wait(&emptysem);
  104. sem_wait(&consumerSync);
  105.  
  106. char tmp;
  107. consumerRead(&tmp);
  108. consumerProcess(&tmp);
  109. consumerPrinting(i, tmp, 2);
  110. if (buffer == 0) {
  111. for (int j = 0; j < number; ++j) {
  112. sem_post(&fullsem);
  113. }
  114. }
  115. sem_post(&consumerSync1);
  116.  
  117. }
  118.  
  119.  
  120. }
  121.  
  122. int main() {
  123. pthread_t t[4];
  124. sem_init(&fullsem, 0, 10);
  125. sem_init(&emptysem, 0, 0);
  126. sem_init(&producerSync, 0, 0);
  127. sem_init(&producerSync1, 0, 1);
  128. sem_init(&consumerSync, 0, 1);
  129. sem_init(&consumerSync1, 0, 1);
  130.  
  131. pthread_create(&t[0], NULL, &produce, NULL);
  132. pthread_create(&t[1], NULL, &produce2, NULL);
  133.  
  134. pthread_create(&t[2], NULL, &consume, NULL);
  135.  
  136.  
  137. pthread_create(&t[3], NULL, &consume2, NULL);
  138.  
  139. pthread_join(t[0], NULL);
  140. pthread_join(t[1], NULL);
  141. pthread_join(t[2], NULL);
  142. pthread_join(t[3], NULL);
  143. sem_destroy(&fullsem);
  144. sem_destroy(&emptysem);
  145. sem_destroy(&consumerSync);
  146. sem_destroy(&consumerSync1);
  147. sem_destroy(&producerSync);
  148. sem_destroy(&producerSync1);
  149.  
  150.  
  151. return 0;
  152. }
  153.  
Success #stdin #stdout 0s 35064KB
stdin
Standard input is empty
stdout
Producer#1 at i=0 : Inserted g , buffer: 1
Producer#2 at i=0 : Inserted u , buffer: 2
Producer#1 at i=1 : Inserted w , buffer: 3
Producer#2 at i=1 : Inserted g , buffer: 4
Producer#1 at i=2 : Inserted a , buffer: 5
Consumer#2 at i=0: Getting A, buffer:4
Consumer#1 at i=0: Getting G, buffer:3
Consumer#1 at i=1: Getting W, buffer:2
Consumer#2 at i=1: Getting U, buffer:1
Consumer#1 at i=2: Getting G, buffer:0
Producer#2 at i=2 : Inserted k , buffer: 1
Producer#1 at i=3 : Inserted m , buffer: 2
Producer#2 at i=3 : Inserted g , buffer: 3
Producer#1 at i=4 : Inserted a , buffer: 4
Producer#2 at i=4 : Inserted M , buffer: 5
Consumer#2 at i=2: Getting M, buffer:4
Consumer#2 at i=3: Getting A, buffer:3
Consumer#1 at i=3: Getting G, buffer:2
Consumer#1 at i=4: Getting M, buffer:1
Consumer#2 at i=4: Getting K, buffer:0
Producer#1 at i=5 : Inserted Q , buffer: 1
Producer#2 at i=5 : Inserted [ , buffer: 2
Producer#1 at i=6 : Inserted U , buffer: 3
Producer#2 at i=6 : Inserted y , buffer: 4
Producer#1 at i=7 : Inserted O , buffer: 5
Consumer#1 at i=5: Getting O, buffer:4
Consumer#2 at i=5: Getting Y, buffer:3
Consumer#2 at i=6: Getting U, buffer:2
Consumer#1 at i=6: Getting [, buffer:1
Consumer#2 at i=7: Getting Q, buffer:0
Producer#2 at i=7 : Inserted o , buffer: 1
Producer#1 at i=8 : Inserted Q , buffer: 2
Producer#2 at i=8 : Inserted m , buffer: 3
Producer#1 at i=9 : Inserted a , buffer: 4
Producer#2 at i=9 : Inserted o , buffer: 5
Consumer#1 at i=7: Getting O, buffer:4
Consumer#1 at i=8: Getting A, buffer:3
Consumer#2 at i=8: Getting M, buffer:2
Consumer#2 at i=9: Getting Q, buffer:1
Consumer#1 at i=9: Getting O, buffer:0