Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Automobil 10 cekao na semaforu 996.057 milisekundi.
- Automobil 5 cekao na semaforu 998.057 milisekundi.
- Automobil 2 cekao na semaforu 999.057 milisekundi.
- Automobil 4 cekao na semaforu 998.057 milisekundi.
- Automobil 1 cekao na semaforu 999.057 milisekundi.
- Automobil 9 cekao na semaforu 996.057 milisekundi.
- Automobil 8 cekao na semaforu 997.057 milisekundi.
- Automobil 3 cekao na semaforu 998.057 milisekundi.
- Automobil 7 cekao na semaforu 997.057 milisekundi.
- Automobil 6 cekao na semaforu 997.057 milisekundi.
- Process returned 0 (0x0) execution time : 2.024 s
- Press any key to continue.
- */
- /* Modelovati protok saobracaja na pesackom prelazu.
- Na prelazu postoji semafor za automobile. Automobili prolaze kada je na semaforu
- zeleno svetlo, a moraju da stanu kada je ukljuceno crveno svetlo.
- Semafor menja svetlo svake 2 sekunde.
- Nit automobil poziva metodu prodjiPesackiPrelaz(). Metoda prodjiPesackiPrelaz() je blokirajuca ukoliko je na semaforu crveno svetlo.
- Ova metoda kao rezultat vraca vremenski period koliko je automobil cekao na semaforu.
- Nit mehanizamSemafora poziva metodu promeniStanje().
- Metoda promeniStanje() menja svetlo na semaforu (ovo se radi svake dve sekunde).
- Napomena: komentari su obavezni.
- */
- #include <cstdlib>
- #include <iostream>
- #include <mutex>
- #include <thread>
- #include <condition_variable>
- using namespace std;
- using namespace chrono;
- int rand_sync() {
- static mutex mx;
- lock_guard<mutex> l(mx);
- return rand();
- }
- class Semafor {
- private:
- mutex mx;
- condition_variable c;
- enum Stanje {CRVENO, ZELENO};
- Stanje stanje;
- public:
- Semafor(): stanje(ZELENO) {}
- duration<double, milli> prodjiPesackiPrelaz();
- void promeniStanje();
- };
- mutex term_mx;
- duration<double, milli> Semafor::prodjiPesackiPrelaz() {
- system_clock::time_point dosao = system_clock::now();
- {
- unique_lock<mutex> lock(mx);
- while (stanje == CRVENO) {
- c.wait(lock);
- }
- }
- system_clock::time_point zavrsio = system_clock::now();
- return zavrsio - dosao;
- }
- void Semafor::promeniStanje() {
- {
- unique_lock<mutex> l(mx);
- if (stanje == CRVENO) {
- stanje = ZELENO;
- c.notify_all();
- }
- else
- stanje = CRVENO;
- }
- this_thread::sleep_for(seconds(2));
- }
- void automobil(Semafor& s, int idAutomobila) {
- this_thread::sleep_for(seconds(rand_sync()%10));//svi dolaze u razlicito vreme na pesacki prelaz
- duration<double, milli> d = s.prodjiPesackiPrelaz();
- lock_guard<mutex> l(term_mx);
- cout << "Automobil " << idAutomobila << " cekao na semaforu " << d.count() << " milisekundi. " << endl;
- }
- void mehanizamSemafora(Semafor& s) {
- for (; ;) {
- s.promeniStanje();
- }
- }
- int main() {
- int ukupnoAutomobila = 10;
- Semafor s;
- thread automobili[ukupnoAutomobila];
- thread promena(mehanizamSemafora, ref(s));
- promena.detach();
- for (int i = 0; i < ukupnoAutomobila; ++i) {
- automobili[i] = thread(automobil, ref(s), i+1);
- }
- for (int i = 0; i < ukupnoAutomobila; ++i) {
- automobili[i].join();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement