Advertisement
nex036ara

posta_kompl

Apr 17th, 2012
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.00 KB | None | 0 0
  1. //Branislav Nikolic,13592
  2.  
  3. // Modelovati salter salu u posti u koju klijenti ulaze na dvoje vrata
  4. // (leva i desna) i staju u dva reda.
  5.  
  6.  
  7. // Klijenti iz levog i desnog reda se opsluzuju naizmenicno.
  8. // Opsluzivanje sledeceg klijenta (iz odgovarajuceg reda) pocinje
  9. // cim se oslobodi neki od saltera.
  10.  
  11. // U posti postoje 2 saltera (nemaju nikakve veze sa redovima).
  12. // Vremensko trajanje uplate (boravak klijenta na salteru) je srazmerno
  13. // velicini uplate. Za svaku uplacenu hiljadu dinara klijent ceka 1 sec.
  14. // Na salteru se moze uplatiti maksimalno 4 hiljada dinara.
  15.  
  16. // Kada klijent zeli da uplati sredstava, on poziva operaciju uplati(),
  17. // cime prakticno ulazi u banku i staje u red.
  18. // Povratna vrednost ove operacije je broj saltera na kojem je klijent
  19. // izvrsio uplatu i svota koja je do tog trenutka na salteru uplacena.
  20.  
  21. // Treba stvoriti 5 klijenata koji ulaze na leva vrata i 5 koji ulaze na desna.
  22.  
  23.  
  24. #include<iostream>
  25. #include<thread>
  26. using namespace std;
  27.  
  28. struct povratna_vrednost {
  29.    size_t salter;
  30.    size_t uplaceno;
  31.    povratna_vrednost(size_t s, size_t u) : salter{s}, uplaceno{u} {}
  32. };
  33.  
  34. class posta {
  35. public:
  36.    enum ulazi { LEVI=0, DESNI };
  37.    posta() : aktivan_red{LEVI}
  38.    { uplaceno[0]=0; uplaceno[1]=0; salter_slobodan[0]=true; salter_slobodan[1]=true; };
  39.  
  40.    povratna_vrednost uplati(size_t svota, ulazi ulaz) {
  41.  
  42.       unique_lock<mutex> l(m);
  43.  
  44.         while((!salter_slobodan[0] && !salter_slobodan[1]) || aktivan_red!=ulaz) {
  45.           red[ulaz].wait(l);
  46.         }
  47.  
  48.       aktivan_red=posta::ulazi((aktivan_red+1)%2);
  49.  
  50.  
  51.       size_t salter = salter_slobodan[0] ? 0 : 1;
  52.       salter_slobodan[salter] = false;
  53.  
  54.       l.unlock();
  55.       this_thread::sleep_for(chrono::seconds(svota));
  56.       l.lock();
  57.       uplaceno[salter]+=svota;
  58.       salter_slobodan[salter] = true;
  59.  
  60.       red[aktivan_red].notify_one();
  61.       return povratna_vrednost{salter,uplaceno[salter]};
  62.    }
  63. private:
  64.    size_t uplaceno[2];
  65.    condition_variable red[2];
  66.    ulazi aktivan_red;
  67.    bool salter_slobodan[2];
  68.    mutex m;
  69. };
  70.  
  71. string naziv_ulaza(posta::ulazi ulaz) {
  72.    if(ulaz==posta::LEVI)  return "levi";
  73.    else                   return "desni";
  74. }
  75.  
  76. void klijent(posta& p, size_t svota, posta::ulazi ulaz) {
  77.    static mutex term_m;
  78.    {
  79.       lock_guard<mutex> l(term_m);
  80.       cout << "Klijent broj: " << this_thread::get_id() << " ulazi na "
  81.            << naziv_ulaza(ulaz) << " ulaz i zeli da uplati " << svota
  82.            << " hiljada dinara" << endl;
  83.    }
  84.    auto ret = p.uplati(svota, ulaz);
  85.    {
  86.       lock_guard<mutex> l(term_m);
  87.       cout << "Klijent broj: " << this_thread::get_id() << " ("
  88.            << naziv_ulaza(ulaz) << ", " << svota << ") salter "
  89.            << ret.salter << " (" << ret.uplaceno << ")"<< endl;
  90.    }
  91. }
  92.  
  93. constexpr size_t KLIJENATA = 10;
  94. int main() {
  95.    posta p;
  96.    thread t[KLIJENATA];
  97.    for(size_t i=0;i<KLIJENATA;++i)
  98.       t[i]=thread(klijent, ref(p), i%7 +1, posta::ulazi(i%2));
  99.    for(size_t i=0;i<KLIJENATA;++i)
  100.       t[i].join();
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement