Advertisement
Lauda

Untitled

Jul 21st, 2014
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.14 KB | None | 0 0
  1. /*
  2. Modelovati placanje robe u trznom centru. U trznom centru postoje 2 kase za placanje.
  3. Kupac pri placanju staje u red na onu kasu na kojoj ceka manji broj kupaca.
  4. Kupac vrsi placanje pozivom metode kupi() koja kao parametar dobija broj artikala koje kupac placa.
  5. Placanje robe traje onoliko sekundi koliko ima artikala.
  6. Povratna vrednost metode je identifikator kase na kojoj je placanje izvrseno.
  7. */
  8.  
  9. #include <iostream>
  10. #include <thread>
  11. #include <mutex>
  12. #include <condition_variable>
  13.  
  14. using namespace std;
  15. using namespace chrono;
  16.  
  17. class Prodavnica {
  18. private:
  19.     mutex m;
  20.     bool kasa_slobodna[2];
  21.     condition_variable redovi[2];
  22.     size_t cekaju[2];
  23.  
  24.     public:
  25.         Prodavnica() {
  26.             kasa_slobodna[0] = true;
  27.             kasa_slobodna[1] = true;
  28.             cekaju[0] = 0;
  29.             cekaju[1] = 0;
  30.         }
  31.  
  32.         size_t kupi(size_t broj_artikala)
  33.         {
  34.             unique_lock<mutex> l(m);
  35.             int mK = 0;
  36.             if (cekaju[0] < cekaju[1])
  37.                 mK = 0;
  38.             else
  39.                 mK = 1;
  40.  
  41.             cekaju[mK]++;
  42.             while (!kasa_slobodna[mK])
  43.                 redovi[mK].wait(l);
  44.  
  45.             kasa_slobodna[mK] = false;
  46.             l.unlock();
  47.             this_thread :: sleep_for(seconds(1));
  48.             l.lock();
  49.  
  50.             cekaju[mK]--;
  51.             kasa_slobodna[mK] = true;
  52.             redovi[mK].notify_one();
  53.  
  54.             return mK;
  55.         }
  56. };
  57.  
  58. mutex term_m;
  59. void kupac(Prodavnica &p, size_t kolicina) {
  60.     thread::id i = this_thread::get_id();
  61.     {
  62.         unique_lock<mutex> l(term_m);
  63.         cout << "Kupac " << i << " zeli da kupi "
  64.              << kolicina << " komada robe." << endl;
  65.     }
  66.     size_t kasa = p.kupi(kolicina);
  67.     {
  68.         unique_lock<mutex> l(term_m);
  69.         cout << "Kupac " << i << " kupio na kasi " << kasa
  70.              << ", " << kolicina << " komada robe." << endl;
  71.     }
  72. }
  73.  
  74. const int brk = 10;
  75. int main()
  76. {
  77.     Prodavnica p;
  78.     thread t[brk];
  79.  
  80.     for (int i=0; i<brk; i++)
  81.         t[i] = thread(kupac, ref(p), i+1);
  82.     for (int i=0; i<brk; i++)
  83.         t[i].join();
  84.  
  85.     return 0;
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement