fork download
  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <semaphore.h>
  4. #include <math.h>
  5. #include <ctype.h>
  6.  
  7. #define NUM 15
  8. int number = NUM, buff = 0;
  9. char queue[NUM][NUM];
  10. sem_t full_sem, empty_sem;
  11.  
  12.  
  13. void insert(char e[]) {
  14. if (buff + 1 < number) {
  15. buff++;
  16. printf(", inserted text: %s", e);
  17. int i = 0;
  18. for (i = 0; i < number; ++i) {
  19. queue[buff][i] = e[i];
  20. }
  21. } else {
  22. printf("\nfull");
  23. }
  24. }
  25.  
  26.  
  27. void *produce2() {
  28. int i = 0;
  29. sem_wait(&full_sem);
  30. printf("\nP2:: insert random text #%d", i);
  31. char tmpChar[number];
  32. int j = 0;
  33. for (j = 0; j < number; ++j) {
  34. tmpChar[j] = (char) 'a' + (random() % 26);
  35. }
  36. insert(tmpChar);
  37. sem_post(&empty_sem);
  38.  
  39.  
  40.  
  41. }
  42.  
  43. void *produce() {
  44. int i = 0;
  45. sem_wait(&full_sem);
  46. printf("\nP1:: insert random text #%d", i);
  47. char tmpChar[number];
  48. int j = 0;
  49. for (j = 0; j < number; ++j) {
  50. tmpChar[j] = (char) 'a' + (random() % 26);
  51. }
  52. insert(tmpChar);
  53. sem_post(&empty_sem);
  54.  
  55.  
  56.  
  57. }
  58.  
  59. void *consume(void *a) {
  60.  
  61. int i = 0;
  62. char v[number];
  63. sem_wait(&empty_sem);
  64.  
  65. if (buff > 0) {
  66. int j = 0;
  67. for (j = 0; j < number; ++j) {
  68. v[j] = toupper(queue[buff][j]);
  69. }
  70. buff--;
  71. } else {
  72. printf("\nempty");
  73. }
  74.  
  75. printf("\nuppercase char: %s", v);
  76. sem_post(&full_sem);
  77.  
  78.  
  79.  
  80. }
  81.  
  82. int main() {
  83. pthread_t t[3];
  84. sem_init(&full_sem, 0, number - 1);
  85. sem_init(&empty_sem, 0, 0);
  86.  
  87. pthread_create(&t[0], NULL, &produce, NULL);
  88. pthread_create(&t[1], NULL, &produce2, NULL);
  89.  
  90. pthread_create(&t[2], NULL, &consume, NULL);
  91. pthread_create(&t[2], NULL, &consume, NULL);
  92.  
  93. pthread_join(t[0], NULL);
  94. pthread_join(t[1], NULL);
  95. pthread_join(t[2], NULL);
  96.  
  97. sem_destroy(&full_sem);
  98. sem_destroy(&empty_sem);
  99. return 0;
  100. }
Success #stdin #stdout 0s 35064KB
stdin
Standard input is empty
stdout
P2::  insert random text #0, inserted text: nwlrbbmqbhcdarz
uppercase char: NWLRBBMQBHCDARZ
P1:: insert random text #0, inserted text: owkkyhiddqscdxr
uppercase char: OWKKYHIDDQSCDXR