Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <mutex>
- #include <condition_variable>
- #include <thread>
- #include <cmath>
- using namespace std;
- int x;
- int y;
- class Semafor {
- public:
- Semafor (int _count = 0) {
- count = _count;
- }
- void postavi() {
- unique_lock<mutex> lock(mtx);
- count++;
- cv.notify_one();
- }
- void cekaj() {
- unique_lock<mutex> lock(mtx);
- while(count == 0) {
- cv.wait(lock);
- }
- count--;
- }
- void resetiraj() {
- count = -1;
- }
- private:
- mutex mtx;
- condition_variable cv;
- int count;
- };
- Semafor sem(-1);
- void dretva_A() {
- x = 0;
- int v = 0;
- int a[100];
- for(int i = 0; i < 100; ++i)
- a[i] = i;
- for(int i = 0; i < 100; ++i)
- x += a[i];
- sem.postavi();
- cout << "Dretva A je gotova\n";
- sem.cekaj();
- cout << "Dretva A faza 2 je pocela\n";
- sem.postavi();
- for(int i = 0; i < 100; ++i)
- v += sqrt(y + a[i]);
- }
- void dretva_B() {
- y = 0;
- int w = 0;
- int b[100];
- for(int i = 0; i < 100; ++i)
- b[i] = i + i;
- for(int i = 0; i < 100; ++i)
- y += b[i];
- sem.postavi();
- cout << "Dretva B je gotova\n";
- sem.cekaj();
- cout << "Dretva B faza 2 je pocela\n";
- sem.postavi();
- for(int i = 0; i < 100; ++i)
- w += sqrt(x + b[i]);
- }
- /*
- Semafor blokira bilo kakav prolazak dok vrijednst "count" je jednaka nula.
- Na početku postavljamo da je njegova vrijednost -1, to možeš vidjeti
- na liniji 43. Kada dretva A ili dretva B završi fazu jedan,
- postavlja semafor te uveća njegovu vrijednost za 1
- (odnosno "count" je nula). Ispiše poruku da je gotova te odlazi u
- položaj "čekaj".
- Kada druga dretva završi fazu jedan, postavlja vrijednost semafora odnosno
- inkrementira njegov brojač(odnosno "count" je jedan). Ispiše poruku da je
- gotava te odlazi i položaj "čekaj".
- U istom trenutku kada je druga dretva postavila "count" na jeda prva dretva
- je izašla iz stanje "čekaj" te na taj način umanjila brojač
- (odnosno "count" je nula), ali odmah postavlja semafor što inkrementira
- brojač te ga postavlja na jedan što daje mogućnost drugoj dretvi da izađe
- iz čekanja i krene s radnjom
- */
- int main() {
- thread t1(dretva_A);
- thread t2(dretva_B);
- t1.join();
- t2.join();
- sem.resetiraj();
- cout << x << " " << y << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment