Advertisement
Lauda

Untitled

May 28th, 2013
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.22 KB | None | 0 0
  1. /* Automobil 10 cekao na semaforu 996.057 milisekundi.
  2. Automobil 5 cekao na semaforu 998.057 milisekundi.
  3. Automobil 2 cekao na semaforu 999.057 milisekundi.
  4. Automobil 4 cekao na semaforu 998.057 milisekundi.
  5. Automobil 1 cekao na semaforu 999.057 milisekundi.
  6. Automobil 9 cekao na semaforu 996.057 milisekundi.
  7. Automobil 8 cekao na semaforu 997.057 milisekundi.
  8. Automobil 3 cekao na semaforu 998.057 milisekundi.
  9. Automobil 7 cekao na semaforu 997.057 milisekundi.
  10. Automobil 6 cekao na semaforu 997.057 milisekundi.
  11.  
  12. Process returned 0 (0x0)   execution time : 2.024 s
  13. Press any key to continue.
  14. */
  15.  
  16. /* Modelovati protok saobracaja na pesackom prelazu.
  17.     Na prelazu postoji semafor za automobile. Automobili prolaze kada je na semaforu
  18.     zeleno svetlo, a moraju da stanu kada je ukljuceno crveno svetlo.
  19.     Semafor menja svetlo svake 2 sekunde.
  20.  
  21.     Nit automobil poziva metodu prodjiPesackiPrelaz(). Metoda prodjiPesackiPrelaz() je blokirajuca ukoliko je na semaforu crveno svetlo.
  22.     Ova metoda kao rezultat vraca vremenski period koliko je automobil cekao na semaforu.
  23.  
  24.     Nit mehanizamSemafora poziva metodu promeniStanje().
  25.     Metoda promeniStanje() menja svetlo na semaforu (ovo se radi svake dve sekunde).
  26.  
  27.  Napomena: komentari su obavezni.
  28. */
  29.  
  30. #include <cstdlib>
  31. #include <iostream>
  32. #include <mutex>
  33. #include <thread>
  34. #include <condition_variable>
  35.  
  36.  
  37. using namespace std;
  38. using namespace chrono;
  39.  
  40. int rand_sync() {
  41.     static mutex mx;
  42.     lock_guard<mutex> l(mx);
  43.     return rand();
  44. }
  45.  
  46. class Semafor {
  47.     private:
  48.         mutex mx;
  49.         condition_variable c;
  50.         enum Stanje {CRVENO, ZELENO};
  51.         Stanje stanje;
  52.     public:
  53.         Semafor(): stanje(ZELENO) {}
  54.         duration<double, milli> prodjiPesackiPrelaz();
  55.         void promeniStanje();
  56. };
  57.  
  58. mutex term_mx;
  59.  
  60. duration<double, milli> Semafor::prodjiPesackiPrelaz() {
  61.     system_clock::time_point dosao = system_clock::now();
  62.     {
  63.         unique_lock<mutex> lock(mx);
  64.         while (stanje == CRVENO) {
  65.             c.wait(lock);
  66.         }
  67.     }
  68.     system_clock::time_point zavrsio = system_clock::now();
  69.     return zavrsio - dosao;
  70. }
  71.  
  72. void Semafor::promeniStanje() {
  73.     {
  74.         unique_lock<mutex> l(mx);
  75.         if (stanje == CRVENO) {
  76.             stanje = ZELENO;
  77.             c.notify_all();
  78.         }
  79.         else
  80.             stanje = CRVENO;
  81.     }
  82.     this_thread::sleep_for(seconds(2));
  83. }
  84.  
  85. void automobil(Semafor& s, int idAutomobila) {
  86.     this_thread::sleep_for(seconds(rand_sync()%10));//svi dolaze u razlicito vreme na pesacki prelaz
  87.     duration<double, milli> d = s.prodjiPesackiPrelaz();
  88.  
  89.     lock_guard<mutex> l(term_mx);
  90.     cout << "Automobil " << idAutomobila << " cekao na semaforu " << d.count() << " milisekundi. " << endl;
  91. }
  92.  
  93. void mehanizamSemafora(Semafor& s) {
  94.     for (; ;) {
  95.         s.promeniStanje();
  96.     }
  97. }
  98.  
  99.  
  100.  
  101. int main() {
  102.     int ukupnoAutomobila = 10;
  103.     Semafor s;
  104.     thread automobili[ukupnoAutomobila];
  105.     thread promena(mehanizamSemafora, ref(s));
  106.     promena.detach();
  107.  
  108.     for (int i = 0; i < ukupnoAutomobila; ++i) {
  109.         automobili[i] = thread(automobil, ref(s), i+1);
  110.     }
  111.  
  112.     for (int i = 0; i < ukupnoAutomobila; ++i) {
  113.         automobili[i].join();
  114.     }
  115.  
  116.     return 0;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement