Guest User

Untitled

a guest
Jul 20th, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.04 KB | None | 0 0
  1.         /*****Condition variable   *******/
  2.  
  3. #include<iostream>
  4. #include<thread>
  5. using namespace std;
  6.  
  7. class koordinator {
  8.    enum redosled {PRVI, DRUGI, TRECI};
  9.    redosled na_redu_je;
  10.    mutex m;
  11.    condition_variable c;
  12.    condition_variable d;
  13. public:
  14.    koordinator() : na_redu_je(PRVI) {}
  15.    void prvi_zavrsio() {
  16.       lock_guard<mutex> lock(m);
  17.       c.notify_one();
  18.       na_redu_je = DRUGI;
  19.    }
  20.    void drugi_zavrsio() {
  21.       lock_guard<mutex> lock(m);
  22.       d.notify_one();
  23.       na_redu_je = TRECI;
  24.    }
  25.    void drugi_ceka() {
  26.       unique_lock<mutex> lock(m);
  27.       while( !(na_redu_je == DRUGI) )
  28.          c.wait(lock);
  29.    }
  30.    void treci_ceka() {
  31.       unique_lock<mutex> lock(m);
  32.       while( !(na_redu_je == TRECI) )
  33.          d.wait(lock);
  34.    }
  35. };
  36. koordinator k;
  37.  
  38. void a() {
  39.    cout << "Ja sam nit a." << endl;
  40.    //this_thread::sleep_for(chrono::seconds(7));
  41.    k.prvi_zavrsio();
  42. }
  43.  
  44. void b() {
  45.    k.drugi_ceka();
  46.    cout << "Ja sam nit b." << endl;
  47.    k.drugi_zavrsio();
  48. }
  49. void c() {
  50.    k.treci_ceka();
  51.    cout << "Ja sam nit c." << endl;
  52. }
  53.  
  54. int main() {
  55.    thread ta(a);
  56.    thread tb(b);
  57.    thread tc(c);
  58.    ta.join();
  59.    tb.join();
  60.    tc.join();
  61. }
  62.  
  63.  
  64.  
  65. /******  Data race      *****/
  66.  
  67. #include<iostream>
  68. #include<thread>
  69. using namespace std;
  70.  
  71. class koordinator {
  72.     enum redosled {PRVADVA,TRECI};
  73.     redosled na_redu_je;
  74.     int brojac;
  75.     mutex m;
  76.     condition_variable c;
  77. public:
  78.    koordinator() : na_redu_je(PRVADVA), brojac(0) {}
  79.  
  80.    void prvi_zavrsio() {
  81.       lock_guard<mutex> lock(m);
  82.       if(brojac == 1){
  83.         brojac++;
  84.         c.notify_one();
  85.       } else
  86.         brojac++;
  87.    }
  88.  
  89.    void treci_ceka() {
  90.       unique_lock<mutex> lock(m);
  91.       while( !(brojac == 2) )
  92.          c.wait(lock);
  93.    }
  94. };
  95. koordinator k;
  96.  
  97. void a() {
  98.    cout << "Ja sam nit a." << endl;
  99.    //this_thread::sleep_for(chrono::seconds(7));
  100.    k.prvi_zavrsio();
  101. }
  102.  
  103. void b() {
  104.    cout << "Ja sam nit b." << endl;
  105.    k.prvi_zavrsio();
  106. }
  107. void c() {
  108.    k.treci_ceka();
  109.    cout << "Ja sam nit c." << endl;
  110. }
  111.  
  112. int main() {
  113.    thread ta(a);
  114.    thread tb(b);
  115.    thread tc(c);
  116.    ta.join();
  117.    tb.join();
  118.    tc.join();
  119. }
  120.  
  121. /*********  Komunikacija box mail     ********/
  122.  
  123. #include<iostream>
  124. #include<thread>
  125.  
  126. using namespace std;
  127.  
  128. struct tacka {
  129.    double x,y;
  130.    tacka() : x(0), y(0) {}
  131.    tacka(double x_, double y_) : x(x_), y(y_) {}
  132. };
  133.  
  134. class Pozicija {
  135.     tacka t;
  136.     bool transfer;
  137.     condition_variable full;
  138.     condition_variable empty;
  139.     mutable mutex mx;
  140. public:
  141.     Pozicija() : transfer(false) {}
  142.     void set(const tacka& t_) {
  143.         unique_lock<mutex> lock(mx);
  144.         while(transfer)
  145.             empty.wait(lock);
  146.         t.x = t_.x;
  147.         t.y = t_.y;
  148.         transfer = true;
  149.         full.notify_one();
  150.    }
  151.    // Konstantno jer samo cita vrednost atributa t.
  152.     const tacka get(){
  153.         unique_lock<mutex> lock(mx);
  154.         while(!transfer)
  155.             full.wait(lock);
  156.         transfer= false;
  157.         empty.notify_one();
  158.         return t;
  159.    }
  160. };
  161.  
  162. Pozicija poz;
  163.  
  164. void proizvodjac() {
  165.     poz.set(tacka(3, 5));
  166.     poz.set(tacka(4, 7));
  167.     poz.set(tacka(5, 6));
  168. }
  169.  
  170. void potrosac() {
  171.     tacka t = poz.get();
  172.     cout << "X=" << t.x << ", Y=" << t.y << endl;
  173.     t = poz.get();
  174.     cout << "X=" << t.x << ", Y=" << t.y << endl;
  175.     t = poz.get();
  176.     cout << "X=" << t.x << ", Y=" << t.y << endl;
  177. }
  178.  
  179. int main() {
  180.     thread t1(proizvodjac);
  181.     thread t2(potrosac);
  182.     t1.join();
  183.     t2.join();
  184. }
  185.  
  186.  
  187.  
  188.  
  189. /*** Parking.h *****/
  190.  
  191.  
  192. #ifndef PARKING_H_INCLUDED
  193. #define PARKING_H_INCLUDED
  194.  
  195. class Parking {
  196.     mutex mx;
  197.     enum Message_box_states { ZAUZET, RASPOLOZIV};
  198.     Message_box_states state;
  199.     int mesta,brojVozila;
  200.     condition_variable full;
  201.     condition_variable empty;
  202.   public:
  203.     Parking(int n) : state(RASPOLOZIV), mesta(n-1), brojVozila(0) {}
  204.  
  205.     void udji() {
  206.         unique_lock<mutex> lock(mx);
  207.         while(state == ZAUZET)
  208.             empty.wait(lock);
  209.         if(brojVozila == mesta )
  210.             state = ZAUZET;
  211.         full.notify_one();
  212.         brojVozila++;
  213.     }
  214.     void izadji() {
  215.         unique_lock<mutex> lock(mx);
  216.         while(brojVozila == 0)
  217.             full.wait(lock);
  218.         state = RASPOLOZIV;
  219.         brojVozila--;
  220.         empty.notify_one();
  221.     }
  222. };
  223.  
  224.  
  225. #endif // PARKING_H_INCLUDED
  226.  
  227. /*** Parking sa jednim mestom ****/
  228.  
  229. #ifndef PARKING_H_INCLUDED
  230. #define PARKING_H_INCLUDED
  231.  
  232.  
  233.  
  234. class Parking {
  235.     mutex mx;
  236.     enum Message_box_states { EMPTY, FULL };
  237.     Message_box_states state;
  238.     condition_variable full;
  239.     condition_variable empty;
  240.   public:
  241.     Parking() : state(EMPTY) {}
  242.  
  243.     void udji() {
  244.         unique_lock<mutex> lock(mx);
  245.         while(state == FULL)
  246.             empty.wait(lock);
  247.         state = FULL;
  248.         full.notify_one();
  249.     }
  250.     void izadji() {
  251.         unique_lock<mutex> lock(mx);
  252.         while(state == EMPTY)
  253.             full.wait(lock);
  254.         state = EMPTY;
  255.         empty.notify_one();
  256.     }
  257. };
Add Comment
Please, Sign In to add comment