Advertisement
Guest User

Untitled

a guest
Mar 30th, 2020
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.62 KB | None | 0 0
  1. #include <iostream>
  2. #include <thread>
  3. #include <chrono>
  4. #include <mutex>
  5. #include <condition_variable>
  6. #include <random>
  7.  
  8. using namespace std;
  9.  
  10. const int CZAS_PRACY = 5;
  11. const int BUFFER_SIZE = 8;
  12. const int LAST_INDEX = BUFFER_SIZE - 1;
  13. const int INITIAL_INDEX = 0;
  14. const int INITIAL_AMOUNT = 0;
  15. const int NULL_VALUE = 0;
  16.  
  17. mutex mut;
  18.  
  19. template <typename TypDanych>
  20. class Monitor
  21. {
  22. private:
  23. char bufferData[BUFFER_SIZE];
  24. int headIndex = INITIAL_INDEX;
  25. int tailIndex = INITIAL_INDEX;
  26. int bufferElements = INITIAL_AMOUNT;
  27. mutex mutexDane;
  28. condition_variable warunekSaNoweDane;
  29. condition_variable warunekZabranoDane;
  30. public:
  31. Monitor()
  32. {
  33. bufferElements = 0;;
  34. }
  35. void zapisz(char data)
  36. {
  37. unique_lock<mutex> blokada(mutexDane);
  38. if(isFull()) warunekZabranoDane.wait(blokada);
  39. bufferData[tailIndex] = data;
  40. bufferElements ++;
  41.  
  42. if(tailIndex == LAST_INDEX) {
  43. tailIndex = 0;
  44. } else {
  45. tailIndex ++;
  46. }
  47. warunekSaNoweDane.notify_one();
  48. }
  49.  
  50. char odczytaj()
  51. {
  52. unique_lock<mutex> blokada(mutexDane);
  53. if(isEmpty()) warunekSaNoweDane.wait(blokada);
  54. char value = bufferData[headIndex];
  55. bufferData[headIndex] = NULL_VALUE;
  56. bufferElements --;
  57.  
  58. if(headIndex == LAST_INDEX) {
  59. headIndex = 0;
  60. } else {
  61. headIndex ++;
  62. }
  63. warunekZabranoDane.notify_one();
  64. return value;
  65. }
  66.  
  67. bool isFull() {
  68. return bufferElements == BUFFER_SIZE;
  69. }
  70.  
  71. bool isEmpty() {
  72. return bufferElements == 0;
  73. }
  74. };
  75.  
  76. class Producent
  77. {
  78. private:
  79. int czas;
  80. Monitor< char >& pojemnik;
  81. char bierzacyZnak;
  82. int random;
  83. int nr;
  84. minstd_rand generator;
  85. uniform_int_distribution< char > rozklad;
  86. public:
  87. Producent(Monitor < char > & _pojemnik, int _nr):
  88. czas(0), pojemnik(_pojemnik), bierzacyZnak('a'),
  89. generator(random_device()()), rozklad('a', 'z'), random(rand() % 5), nr(_nr)
  90. {
  91. }
  92.  
  93. void operator()()
  94. {
  95. while (czas<CZAS_PRACY)
  96. {
  97. pojemnik.zapisz(bierzacyZnak);
  98. bierzacyZnak = (bierzacyZnak+1-97)%25+97;
  99. mut.lock();
  100. cout <<"Producent nr: "<<nr<<" znak: "<< bierzacyZnak << endl;
  101. //pojemnik.zapisz(rozklad(generator));
  102. mut.unlock();
  103. this_thread::sleep_for(chrono::seconds(random));
  104. ++czas;
  105. }
  106. pojemnik.zapisz(EOF);
  107. }
  108.  
  109. };
  110.  
  111. class Konsument
  112. {
  113. private:
  114. Monitor< char >& pojemnik;
  115. int nr;
  116. public:
  117. Konsument(Monitor< char >& _pojemnik, int _nr):
  118. pojemnik(_pojemnik), nr(_nr) {}
  119.  
  120. void operator()()
  121. {
  122. char znak=pojemnik.odczytaj();
  123. while(znak!=EOF)
  124. {
  125. mut.lock();
  126. cout <<"Konsument nr: "<<nr<<" znak: "<< znak << endl;
  127. mut.unlock();
  128. znak = pojemnik.odczytaj();
  129. }
  130. }
  131. };
  132. int main()
  133. {
  134. random_device r;
  135. minstd_rand generator(r());
  136. Monitor< char > pojemnik;
  137. Konsument konsument(pojemnik, 1);
  138. Konsument konsument2(pojemnik, 2);
  139. Konsument konsument3(pojemnik, 3);
  140. Producent producent(pojemnik, 1);
  141. Producent producent2(pojemnik, 2);
  142. Producent producent3(pojemnik, 3);
  143.  
  144. thread wk(konsument);
  145. thread wk2(konsument2);
  146. thread wk3(konsument3);
  147. thread wp(producent);
  148. thread wp2(producent2);
  149. thread wp3(producent3);
  150. wp.join();
  151. wk.join();
  152. wp2.join();
  153. wk2.join();
  154. wp3.join();
  155. wk3.join();
  156. return 0;
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement