Advertisement
Guest User

boost zadanie 2 kolos z obrazka

a guest
May 16th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.25 KB | None | 0 0
  1. // zad 2
  2.  
  3. #include <iostream>
  4. #include <boost/thread.hpp>
  5. #include <boost/thread/mutex.hpp>
  6. #include <boost/thread/condition_variable.hpp>
  7.  
  8. using namespace std;
  9. using namespace boost;
  10.  
  11. //globalna tablica znakow
  12. int globalnaTablica[20];
  13.  
  14. //zmienna przechowujaca true/false, ktore odpowiada czy dane sa gotowe czy nie
  15. bool saDane = false;
  16.  
  17. //warunek sprawdzenia danych
  18. boost::condition_variable warunekSaDane;
  19.  
  20. //mutex do blokowania dancyh
  21. boost::mutex mutexDanych;
  22.  
  23. class Watek{
  24. public:
  25.     Watek(int n) : ile(n)
  26.         {
  27.  
  28.         }
  29.         //kod do wykonania
  30.        
  31.         void operator()(){
  32.     //petla generujaca znaki
  33.     for (int i = 0; i < ile; ++i) {
  34.         //blokada danych
  35.         unique_lock<mutex> blokadaDanych(mutexDanych);
  36.         if(saDane)
  37.         {
  38.          warunekSaDane.wait(blokadaDanych);
  39.         }
  40.         globalnaTablica[i] =i*i;
  41.         saDane = true;
  42.         warunekSaDane.notify_one();
  43.     }
  44. }
  45. private:
  46.     int ile;
  47. };
  48.  
  49.  
  50. int main() {
  51.     int ilosc_znakow=10;
  52.    
  53.     //stworz watek.
  54.     boost::thread watek(Watek(10));
  55.  
  56.         for (int i = 0; i < ilosc_znakow; ++i) {
  57.                 boost::unique_lock<boost::mutex> blokadaDanych(mutexDanych);
  58.                 if(!saDane)
  59.                 {
  60.                      //cout<<".....czekam na dane"<<endl;
  61.                     //jezeli nie ma danych wtedy czekaj: wystepuje blokada watku.
  62.                 warunekSaDane.wait(blokadaDanych);
  63.                 }
  64.                 //jezeli sa dane.. po poczekaniu na nie, wypisz znak z globalnej tablicy:
  65.                 cout << i << ": " << globalnaTablica[i] << endl;
  66.                 //ustaw zmienna saDane na false, poniewaz nie ma jeszcze danych
  67.                 saDane = false;
  68.                
  69. //Klasa condition_variable zapewnia mechanizm, dzięki któremu wątek może czekać na powiadomienie z innego wątku. Kiedy wątek budzi się z oczekiwania, sprawdza, czy odpowiedni warunek jest teraz prawdziwy i kontynuuje, jeśli tak.
  70. //Jeśli warunek nie jest spełniony, włókno czeka ponownie, wzywa, aby wznowić oczekiwanie.
  71. //W najprostszym przypadku ten warunek jest tylko zmienną logiczną:
  72.                 warunekSaDane.notify_one();
  73.         }
  74.  
  75.         watek.join();
  76.         return 0;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement