Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Modelovati placanje robe u trznom centru. U trznom centru postoje 2 kase za placanje.
- Kupac pri placanju staje u red na onu kasu na kojoj ceka manji broj kupaca.
- Kupac vrsi placanje pozivom metode kupi() koja kao parametar dobija broj artikala koje kupac placa.
- Placanje robe traje onoliko sekundi koliko ima artikala.
- Povratna vrednost metode je identifikator kase na kojoj je placanje izvrseno.
- */
- #include <iostream>
- #include <thread>
- #include <mutex>
- #include <condition_variable>
- using namespace std;
- using namespace chrono;
- class Prodavnica {
- private:
- mutex m;
- bool kasa_slobodna[2];
- condition_variable redovi[2];
- size_t cekaju[2];
- public:
- Prodavnica() {
- kasa_slobodna[0] = true;
- kasa_slobodna[1] = true;
- cekaju[0] = 0;
- cekaju[1] = 0;
- }
- size_t kupi(size_t broj_artikala)
- {
- unique_lock<mutex> l(m);
- int mK = 0;
- if (cekaju[0] < cekaju[1])
- mK = 0;
- else
- mK = 1;
- cekaju[mK]++;
- while (!kasa_slobodna[mK])
- redovi[mK].wait(l);
- kasa_slobodna[mK] = false;
- l.unlock();
- this_thread :: sleep_for(seconds(1));
- l.lock();
- cekaju[mK]--;
- kasa_slobodna[mK] = true;
- redovi[mK].notify_one();
- return mK;
- }
- };
- mutex term_m;
- void kupac(Prodavnica &p, size_t kolicina) {
- thread::id i = this_thread::get_id();
- {
- unique_lock<mutex> l(term_m);
- cout << "Kupac " << i << " zeli da kupi "
- << kolicina << " komada robe." << endl;
- }
- size_t kasa = p.kupi(kolicina);
- {
- unique_lock<mutex> l(term_m);
- cout << "Kupac " << i << " kupio na kasi " << kasa
- << ", " << kolicina << " komada robe." << endl;
- }
- }
- const int brk = 10;
- int main()
- {
- Prodavnica p;
- thread t[brk];
- for (int i=0; i<brk; i++)
- t[i] = thread(kupac, ref(p), i+1);
- for (int i=0; i<brk; i++)
- t[i].join();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement