Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Branislav Nikolic,13592
- // Modelovati salter salu u posti u koju klijenti ulaze na dvoje vrata
- // (leva i desna) i staju u dva reda.
- // Klijenti iz levog i desnog reda se opsluzuju naizmenicno.
- // Opsluzivanje sledeceg klijenta (iz odgovarajuceg reda) pocinje
- // cim se oslobodi neki od saltera.
- // U posti postoje 2 saltera (nemaju nikakve veze sa redovima).
- // Vremensko trajanje uplate (boravak klijenta na salteru) je srazmerno
- // velicini uplate. Za svaku uplacenu hiljadu dinara klijent ceka 1 sec.
- // Na salteru se moze uplatiti maksimalno 4 hiljada dinara.
- // Kada klijent zeli da uplati sredstava, on poziva operaciju uplati(),
- // cime prakticno ulazi u banku i staje u red.
- // Povratna vrednost ove operacije je broj saltera na kojem je klijent
- // izvrsio uplatu i svota koja je do tog trenutka na salteru uplacena.
- // Treba stvoriti 5 klijenata koji ulaze na leva vrata i 5 koji ulaze na desna.
- #include<iostream>
- #include<thread>
- using namespace std;
- struct povratna_vrednost {
- size_t salter;
- size_t uplaceno;
- povratna_vrednost(size_t s, size_t u) : salter{s}, uplaceno{u} {}
- };
- class posta {
- public:
- enum ulazi { LEVI=0, DESNI };
- posta() : aktivan_red{LEVI}
- { uplaceno[0]=0; uplaceno[1]=0; salter_slobodan[0]=true; salter_slobodan[1]=true; };
- povratna_vrednost uplati(size_t svota, ulazi ulaz) {
- unique_lock<mutex> l(m);
- while((!salter_slobodan[0] && !salter_slobodan[1]) || aktivan_red!=ulaz) {
- red[ulaz].wait(l);
- }
- aktivan_red=posta::ulazi((aktivan_red+1)%2);
- size_t salter = salter_slobodan[0] ? 0 : 1;
- salter_slobodan[salter] = false;
- l.unlock();
- this_thread::sleep_for(chrono::seconds(svota));
- l.lock();
- uplaceno[salter]+=svota;
- salter_slobodan[salter] = true;
- red[aktivan_red].notify_one();
- return povratna_vrednost{salter,uplaceno[salter]};
- }
- private:
- size_t uplaceno[2];
- condition_variable red[2];
- ulazi aktivan_red;
- bool salter_slobodan[2];
- mutex m;
- };
- string naziv_ulaza(posta::ulazi ulaz) {
- if(ulaz==posta::LEVI) return "levi";
- else return "desni";
- }
- void klijent(posta& p, size_t svota, posta::ulazi ulaz) {
- static mutex term_m;
- {
- lock_guard<mutex> l(term_m);
- cout << "Klijent broj: " << this_thread::get_id() << " ulazi na "
- << naziv_ulaza(ulaz) << " ulaz i zeli da uplati " << svota
- << " hiljada dinara" << endl;
- }
- auto ret = p.uplati(svota, ulaz);
- {
- lock_guard<mutex> l(term_m);
- cout << "Klijent broj: " << this_thread::get_id() << " ("
- << naziv_ulaza(ulaz) << ", " << svota << ") salter "
- << ret.salter << " (" << ret.uplaceno << ")"<< endl;
- }
- }
- constexpr size_t KLIJENATA = 10;
- int main() {
- posta p;
- thread t[KLIJENATA];
- for(size_t i=0;i<KLIJENATA;++i)
- t[i]=thread(klijent, ref(p), i%7 +1, posta::ulazi(i%2));
- for(size_t i=0;i<KLIJENATA;++i)
- t[i].join();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement