Advertisement
Guest User

Untitled

a guest
Mar 29th, 2020
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.60 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. template <typename TypDanych>
  12.  
  13. class Monitor
  14. {
  15. private:
  16. TypDanych dane;
  17. bool saDane;
  18.  
  19. mutex mutexDane;
  20. condition_variable warunekSaNoweDane;
  21. condition_variable warunekZabranoDane;
  22. public:
  23. Monitor()
  24. {
  25. saDane=false;
  26. }
  27. void zapisz(TypDanych noweDane)
  28. {
  29. unique_lock<mutex> blokada(mutexDane);
  30. if(saDane) warunekZabranoDane.wait(blokada);
  31. saDane=true;
  32. dane=noweDane;
  33. warunekSaNoweDane.notify_one();
  34. }
  35. TypDanych odczytaj()
  36. {
  37. unique_lock<mutex> blokada(mutexDane);
  38. if(!saDane) warunekSaNoweDane.wait(blokada);
  39. saDane=false;
  40. warunekZabranoDane.notify_one();
  41. return dane;
  42. }
  43. };
  44. class Producent
  45. {
  46. private:
  47. int czas;
  48.  
  49. Monitor< char >& pojemnik;
  50. char biezacyZnak;
  51.  
  52. minstd_rand generator;
  53. uniform_int_distribution< char > rozklad;
  54. public:
  55. int numerp;
  56. Producent(Monitor < char >& pojemnik,int _numer):
  57.  
  58. czas(0), pojemnik(pojemnik), biezacyZnak('a'),
  59. generator(random_device()()), rozklad('a','z'),numerp(_numer)
  60. {
  61. }
  62. void operator()()
  63. {
  64. while (czas<CZAS_PRACY)
  65. {
  66.  
  67. int wylosowana_liczba =( std::rand() % 10 ) + 1;
  68. pojemnik.zapisz(biezacyZnak);
  69. biezacyZnak=(biezacyZnak+1-97)%25+97;
  70. this_thread::sleep_for(chrono::seconds(wylosowana_liczba));
  71.  
  72. }
  73. pojemnik.zapisz(EOF);
  74. }
  75. int getnumerp(){
  76. return numerp
  77. }
  78. };
  79. class Konsument
  80. {
  81. private:
  82. Monitor< char >& pojemnik;
  83. int numer;
  84.  
  85. public:
  86. Konsument(Monitor< char >& _pojemnik,int _numer): pojemnik(_pojemnik),numer(_numer){}
  87.  
  88. void operator()()
  89. {
  90.  
  91. char znak=pojemnik.odczytaj();
  92. while (znak!=EOF)
  93. {
  94. cout<<"Konsument : "<<numer<<" Producent"<<numer<<" generuje --> "<<znak<<endl;
  95. znak=pojemnik.odczytaj();
  96.  
  97.  
  98. }
  99. }
  100. };
  101.  
  102. int main()
  103. {
  104. random_device r;
  105. minstd_rand generator(r());
  106. Monitor< char > pojemnik;
  107. Konsument konsument(pojemnik,1);
  108. Konsument konsument2(pojemnik,2);
  109. Producent producent(pojemnik,1);
  110. Producent producent2(pojemnik,2);
  111. thread wk(konsument);
  112. thread wp(producent);
  113. thread wk2(konsument2);
  114. thread wp2(producent2);
  115.  
  116.  
  117. wp.join();
  118. wk.join();
  119. wp2.join();
  120. wk2.join();
  121.  
  122. return (EXIT_SUCCESS);
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement