Advertisement
Lauda

Parking place - 3 gates

Jul 21st, 2014
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.92 KB | None | 0 0
  1. // Parking sa 3 ulaza.
  2. // Na parking automobili ulaze sa ulaza 0, 1 i 2 po round-robin protokolu
  3. // (jedan udje sa prvog, jedan sa drugog, jedan sa treceg i tako u krug).
  4.  
  5. // Automobilu se pri stvaranju prosledjuje vreme (u sekundama) koje se on
  6. // zadrzave na parkingu.
  7. // U programu uvek ima jednak broj automobila na svim ulazima!
  8.  
  9. #include <iostream>
  10. #include <mutex>
  11. #include <thread>
  12. #include <condition_variable>
  13.  
  14. using namespace std;
  15. using namespace chrono;
  16.  
  17. class parking {
  18. private:
  19.     mutex m;
  20.     condition_variable na_ulazu[3];
  21.     int sM;
  22.     int aU;
  23. public:
  24.     duration<double, milli> cekao;
  25.    parking() : sM(1), aU(0) {}
  26.    void udji(size_t ulaz)
  27.    {
  28.        unique_lock<mutex> l(m);
  29.        system_clock :: time_point dosao = system_clock :: now();
  30.        while (sM == 0 || aU != ulaz)
  31.         na_ulazu[ulaz].wait(l);
  32.         cekao = system_clock :: now() - dosao;
  33.        --sM;
  34.        aU = (aU+1) % 3;
  35.    }
  36.    void izadji()
  37.    {
  38.        unique_lock<mutex> l(m);
  39.        ++sM;
  40.        na_ulazu[aU].notify_one();
  41.    }
  42. };
  43.  
  44. mutex term_m;
  45. void automobil(parking& p, size_t ulaz, size_t ostajem_na_parkingu) {
  46.     thread::id id = this_thread::get_id();
  47.     {
  48.         lock_guard<mutex> l(term_m);
  49.         cout<<"Automobil "<<id<<" pokusava da udje na parking na ulaz "<< ulaz<<endl;
  50.     }
  51.     p.udji(ulaz);
  52.     {
  53.         lock_guard<mutex> l(term_m);
  54.         cout<<"Automobil "<<id<<" usao na parking na ulaz "<< ulaz<< " nakon: " << p.cekao.count() << " milisekundi cekanja." << endl;
  55.     }
  56.     this_thread::sleep_for(chrono::seconds(ostajem_na_parkingu));
  57.     p.izadji();
  58.     lock_guard<mutex> l(term_m);
  59.     cout<<"Automobil "<<id<<" izasao sa parkinga."<<endl;
  60. }
  61.  
  62. const int A = 10;
  63.  
  64. int main()
  65. {
  66.     parking p;
  67.     thread t[A];
  68.  
  69.     for (int i=0; i<A; ++i)
  70.         t[i] = thread(automobil, ref(p), i%3, i%2);
  71.     for (int i=0; i<A; ++i)
  72.         t[i].join();
  73.  
  74.     return 0;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement