Habsburg

da

Jul 13th, 2016
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.31 KB | None | 0 0
  1. #include <iostream>
  2. #include <mutex>
  3. #include <condition_variable>
  4. #include <thread>
  5. #include <cmath>
  6.  
  7. using namespace std;
  8.  
  9. int x;
  10. int y;
  11.  
  12.  
  13. class Semafor {
  14.     public:
  15.         Semafor (int _count = 0) {
  16.             count = _count;
  17.         }
  18.         void postavi() {
  19.             unique_lock<mutex> lock(mtx);
  20.             count++;
  21.             cv.notify_one();
  22.         }
  23.        
  24.         void cekaj() {
  25.             unique_lock<mutex> lock(mtx);
  26.            
  27.             while(count == 0) {
  28.                 cv.wait(lock);
  29.             }
  30.             count--;
  31.            
  32.         }
  33.        
  34.         void resetiraj() {
  35.             count = -1;
  36.         }
  37.     private:
  38.         mutex mtx;
  39.         condition_variable cv;
  40.         int count;
  41.    
  42. };
  43. Semafor sem(-1);
  44.  
  45. void dretva_A() {
  46.     x = 0;
  47.     int v = 0;
  48.    
  49.     int a[100];
  50.     for(int i = 0; i < 100; ++i)
  51.         a[i] = i;
  52.        
  53.     for(int i = 0; i < 100; ++i)
  54.         x += a[i];
  55.    
  56.     sem.postavi();
  57.     cout << "Dretva A je gotova\n";
  58.     sem.cekaj();
  59.     cout << "Dretva A faza 2 je pocela\n";
  60.     sem.postavi();
  61.    
  62.     for(int i = 0; i < 100; ++i)
  63.         v += sqrt(y + a[i]);
  64.    
  65.    
  66. }
  67. void dretva_B() {
  68.     y = 0;
  69.     int w = 0;
  70.    
  71.     int b[100];
  72.     for(int i = 0; i < 100; ++i)
  73.         b[i] = i + i;
  74.        
  75.     for(int i = 0; i < 100; ++i)
  76.         y += b[i];
  77.    
  78.     sem.postavi();
  79.     cout << "Dretva B je gotova\n";
  80.     sem.cekaj();
  81.     cout << "Dretva B faza 2 je pocela\n";
  82.     sem.postavi();
  83.    
  84.     for(int i = 0; i < 100; ++i)
  85.         w += sqrt(x + b[i]);
  86.    
  87. }
  88.  
  89.  
  90. /*
  91.     Semafor blokira bilo kakav prolazak dok vrijednst "count" je jednaka nula.
  92.     Na početku postavljamo da je njegova vrijednost -1, to možeš vidjeti
  93.     na liniji 43. Kada dretva A ili dretva B  završi fazu jedan,
  94.     postavlja semafor te uveća njegovu vrijednost za 1
  95.     (odnosno "count" je nula). Ispiše poruku da je gotova te odlazi u
  96.     položaj "čekaj".
  97.     Kada druga dretva završi fazu jedan, postavlja vrijednost semafora odnosno
  98.     inkrementira njegov brojač(odnosno "count" je jedan). Ispiše poruku da je
  99.     gotava te odlazi i položaj "čekaj".
  100.    
  101.     U istom trenutku kada je druga dretva postavila "count" na jeda prva dretva
  102.     je izašla iz stanje "čekaj" te na taj način umanjila brojač
  103.     (odnosno "count" je nula), ali odmah postavlja semafor što inkrementira
  104.     brojač te ga postavlja na jedan što daje mogućnost drugoj dretvi da izađe
  105.     iz čekanja i krene s radnjom
  106.  
  107.  
  108. */
  109. int main() {
  110.     thread t1(dretva_A);
  111.     thread t2(dretva_B);
  112.    
  113.    
  114.     t1.join();
  115.     t2.join();
  116.     sem.resetiraj();
  117.    
  118.     cout << x << " " << y << endl;
  119.     return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment