fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #include <unistd.h> // replace this with #include<windows.h> for windows platform
  5.  
  6. #define BUFFER_SIZE 99
  7. #define PRODUCTION_COST 0
  8.  
  9. char producer_array[BUFFER_SIZE * 10];
  10. char consumer_array[BUFFER_SIZE];
  11.  
  12. int producer_index = 0;
  13. int consumer_index = 0;
  14.  
  15. pthread_mutex_t producer_mutex = PTHREAD_MUTEX_INITIALIZER;
  16. pthread_mutex_t consumer_mutex = PTHREAD_MUTEX_INITIALIZER;
  17. pthread_cond_t producer_cond = PTHREAD_COND_INITIALIZER;
  18. pthread_cond_t consumer_cond = PTHREAD_COND_INITIALIZER;
  19.  
  20. void *producer1(void *arg) {
  21. while (1) {
  22. char product;
  23. int rand_int = rand() % 3; // Change to 3 for three types of products
  24.  
  25. if (rand_int == 0) {
  26. product = 'B';
  27. sleep(PRODUCTION_COST);
  28. } else if (rand_int == 1) {
  29. product = 'R';
  30. sleep(PRODUCTION_COST);
  31. } else {
  32. product = 'G';
  33. sleep(PRODUCTION_COST);
  34. }
  35.  
  36. pthread_mutex_lock(&producer_mutex);
  37. if (producer_index >= BUFFER_SIZE * 10) {
  38. pthread_mutex_unlock(&producer_mutex);
  39. break;
  40. }
  41. producer_array[producer_index++] = product;
  42. pthread_cond_signal(&producer_cond);
  43. pthread_mutex_unlock(&producer_mutex);
  44. }
  45. pthread_exit(NULL);
  46. }
  47.  
  48. void *consumer(void *arg) {
  49. while (1) {
  50. pthread_mutex_lock(&consumer_mutex);
  51. if (consumer_index >= BUFFER_SIZE) {
  52. pthread_mutex_unlock(&consumer_mutex);
  53. break;
  54. }
  55.  
  56. pthread_mutex_lock(&producer_mutex);
  57. while (producer_index <= 0) {
  58. pthread_cond_wait(&producer_cond, &producer_mutex);
  59. }
  60. char last_p_char = producer_array[producer_index - 1];
  61. char last_c_char = (consumer_index > 0) ? consumer_array[consumer_index - 1] : '\0';
  62. if ((last_c_char == 'G' && last_p_char == 'B') ||
  63. (last_c_char == 'B' && last_p_char == 'R') ||
  64. (last_c_char == 'R' && last_p_char == 'G') ||
  65. (last_c_char == '\0' && last_p_char == 'B')) { // Change to 'B' for the sequence to be BRG
  66. consumer_array[consumer_index++] = last_p_char;
  67. producer_index--;
  68. }
  69. pthread_cond_signal(&consumer_cond);
  70. pthread_mutex_unlock(&producer_mutex);
  71. pthread_mutex_unlock(&consumer_mutex);
  72. }
  73. pthread_exit(NULL);
  74. }
  75.  
  76. int main() {
  77. pthread_t producer_thread;
  78. pthread_t consumer_thread;
  79.  
  80. pthread_create(&producer_thread, NULL, producer1, NULL);
  81. pthread_create(&consumer_thread, NULL, consumer, NULL);
  82.  
  83. pthread_join(producer_thread, NULL);
  84. pthread_join(consumer_thread, NULL);
  85.  
  86. printf("Consumer Array: ");
  87. for (int i = 0; i < consumer_index-1; i++) {
  88. printf("%c", consumer_array[i]);
  89. }
  90. printf("\n");
  91.  
  92. printf("Producer Array: ");
  93. for (int i = 0; i < producer_index-1; i++) {
  94. printf("%c", producer_array[i]);
  95. }
  96. printf("\n");
  97.  
  98. return 0;
  99. }
  100.  
Success #stdin #stdout 0.25s 5312KB
stdin
Standard input is empty
stdout
Consumer Array: BRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBR
Producer Array: RRRBRRRRGGBGGRRGBBGBRRRBGGGGGGBBBBGBGGBBGGBBGBGBGBGGGBGBBGBRGGRGGRGRRGRBRGGBBGRBRRGGRGGBRGRGRBRGGBBBBGRRRGGGRRRBBBBGBGBBGGGRGRBGGGRBGBGRBBRGGGBGBRGRRGRBRRBRGBGRBBGGRBGGBBGBBGGBRGGBGBRRGRBRGGRBBRBGRGGGBRGBBBRBBRBGGRRBBGGBGBBRBRRGRBGRRGGGBGGBRBRRGGRBGRBGGRBGRRGGGGGBGGBBRBRGRGGBGBRRRGRRRGRGRRGBBRRRGGRBBBRRBBBBBRGBRRGBBRBGBGBBGGRRRBGGRBBGRRGBBRBGBBGGRGGRGGBRRGGBBGGGBRGGGRGBBBGRBGRGRBRRGGBGRBGGBBRBGBBGGGBBBBGBBBBGBGBBRRGGGBGGRRBBBRGBRBRGRBBGRRRGRBRGGBBGRBGGGGBBRRRRRGBBRRGBRGBGBRGGGBRRBBRBBBRGRGBBGRRBBRRRRGRRRRRBRBGGRGBGGRGRRBRGGBGGGRRRRBBGRGRBBBBRBBRGBBBGRBRBBGRGRBGBBGBGGRBGBRRBGBRGRGGBGRRBBGBGBGGBGGBGGBGGGRBRGRGBRGBRBGGRGBBGBBBRBBRGRBGBGBGRGRGRBBBRBGGBBBBGRRBGGRGBRBGRRGGBBRGRBBGBBBRRBGBGRRGBBGRRGRBBBBGBBRGBRGRRGGBBGRBBBBRBBBGBGBGGBRRRBBRGBGRBGBRGRRGGGRBBRGRBBBBGGRBGGGGBGRBRRRBBRBBRRRGBRBRBRRGRBBGBBRRBBRRGRBBBRRRBBBRGBGBGGGRBBBRRGGRBGBGBRBBBBGRBBGBBGBRGBBBRRRGBGBRRRGRBGGBBGRRGRGGRBRRBRGGGRRRBGGRRRBGGBGGGRRRBRGGGBBGBBBBGRRGGGGRBGBGRGBBRRGRGGRGGGBBBBRGGBBRGGGRGGRBGRGBBGGBRRBRRBGGRR