Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Parking sa 3 ulaza.
- // Na parking automobili ulaze sa ulaza 0, 1 i 2 po round-robin protokolu
- // (jedan udje sa prvog, jedan sa drugog, jedan sa treceg i tako u krug).
- // Automobilu se pri stvaranju prosledjuje vreme (u sekundama) koje se on
- // zadrzave na parkingu.
- // U programu uvek ima jednak broj automobila na svim ulazima!
- #include <iostream>
- #include <mutex>
- #include <thread>
- #include <condition_variable>
- using namespace std;
- using namespace chrono;
- class parking {
- private:
- mutex m;
- condition_variable na_ulazu[3];
- int sM;
- int aU;
- public:
- duration<double, milli> cekao;
- parking() : sM(1), aU(0) {}
- void udji(size_t ulaz)
- {
- unique_lock<mutex> l(m);
- system_clock :: time_point dosao = system_clock :: now();
- while (sM == 0 || aU != ulaz)
- na_ulazu[ulaz].wait(l);
- cekao = system_clock :: now() - dosao;
- --sM;
- aU = (aU+1) % 3;
- }
- void izadji()
- {
- unique_lock<mutex> l(m);
- ++sM;
- na_ulazu[aU].notify_one();
- }
- };
- mutex term_m;
- void automobil(parking& p, size_t ulaz, size_t ostajem_na_parkingu) {
- thread::id id = this_thread::get_id();
- {
- lock_guard<mutex> l(term_m);
- cout<<"Automobil "<<id<<" pokusava da udje na parking na ulaz "<< ulaz<<endl;
- }
- p.udji(ulaz);
- {
- lock_guard<mutex> l(term_m);
- cout<<"Automobil "<<id<<" usao na parking na ulaz "<< ulaz<< " nakon: " << p.cekao.count() << " milisekundi cekanja." << endl;
- }
- this_thread::sleep_for(chrono::seconds(ostajem_na_parkingu));
- p.izadji();
- lock_guard<mutex> l(term_m);
- cout<<"Automobil "<<id<<" izasao sa parkinga."<<endl;
- }
- const int A = 10;
- int main()
- {
- parking p;
- thread t[A];
- for (int i=0; i<A; ++i)
- t[i] = thread(automobil, ref(p), i%3, i%2);
- for (int i=0; i<A; ++i)
- t[i].join();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement