Advertisement
nex036ara

zad1

May 30th, 2012
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.87 KB | None | 0 0
  1. /*** Branislav Nikolic,e13592
  2. Modelovati konkurentni program koji simulira ponasanje jednog aerodroma.
  3.  Aerodrom koriste avioni (MALI, SREDNJI, VELIKI) koji sa njega uzlecu i slecu.
  4.  Kontrolu nad pristupom aerodromskom pistom vrsi kontrolni toranj.
  5.  Kontrolni toranj vrsi rasporedjivanje poletanja i sletanja. Aerodrom poseduje jednu pistu.
  6.  
  7. Ukoliko avion polece/slece on proverava da li je kontrolni toranj slobodan.
  8. Ukoliko jeste zauzima ga (tako da ga ni jedan drugi avion nakon toga ne moze koristiti)
  9.  i od kontrolnog tornja trazi dozvolu za poletanje/sletanje na pistu.
  10.   Nakon toga avion ceka odgovor od kontrolnog tornja. Kada avion primi odobrenje kontrolnog tornja avion
  11.   koristi pistu i polece/slece. Poletanje sa aerodroma traje
  12.   3 sekunde (MALI), 5 sekundi (SREDNJI), 8 sekundi (VELIKI).
  13.   Sletanje na aerodrom traje 2 sekunde (MALI), 4 sekunde (SREDNJI), 7 sekundi (VELIKI).
  14.    Nakon poletanja ili sletanja avion oslobadja kontrolni toranj da bi mogli da ga koriste i drugi avioni.
  15.  
  16. Nit avion treba da vrati trenutke kada je zatrazio (poletanje ili sletanje),
  17. kada mu je odobreno (poletanje ili sletanje) i kada je zavrsio date operacije.
  18.  
  19. Nit kontrolni toranj sluzi za opsluzivanje poletanja i sletanja na aerodrom.
  20.  Kontrolni toranj ceka da ga neki avion zauzme i da mu prosledi zahtev za poletanje ili sletanje.
  21.  Kada dobije zahtev kontrolni tornj ceka jednu sekundu da obradi podatke o avionu i nakon toga odobrava poletanje ili sletanje.
  22. */
  23.  
  24. #include<iostream>
  25. #include<thread>
  26. #include<string>
  27.  
  28. using namespace std;
  29. using namespace chrono;
  30.  
  31. int rand_sync() {
  32. static mutex mx;
  33. lock_guard<mutex> l(mx);
  34. return rand();
  35. }
  36.  
  37. enum tip_aviona {MALI=0, SREDNJI, VELIKI};
  38. enum tip_zahteva {POLETANJE=0, SLETANJE};
  39. enum tip_niti {AVION=0, TORANJ};
  40.  
  41. string nazivi[2][2] = {{"Poleteo","poletanje"},{"Sleteo","sletanje"}};
  42. string tipoviAviona[3] = {"Learjet","Airbus","Jumbo Jet"};
  43.  
  44. struct vremena {
  45. monotonic_clock::time_point zatrazio;
  46. monotonic_clock::time_point odobreno;
  47. monotonic_clock::time_point zavrsio;
  48. };
  49.  
  50. class Aerodrom {
  51.     private:
  52.         mutex m;
  53.         bool toranj_slobodan;
  54.  
  55.         condition_variable mali;
  56.         condition_variable srednji;
  57.         condition_variable veliki;
  58.         condition_variable toranj;
  59.     public:
  60.         Aerodrom():toranj_slobodan(true){}
  61.  
  62.         vremena zahtev_aviona(tip_zahteva tip_z, tip_aviona tip_a){
  63.             vremena v;
  64.                 v.zatrazio = monotonic_clock::now();
  65.  
  66.                    unique_lock<mutex>l(m);
  67.  
  68.                    if(tip_a==MALI){
  69.  
  70.                        while(toranj_slobodan==false)
  71.                             mali.wait(l);
  72.  
  73.                          toranj_slobodan=false;
  74.                          v.odobreno = monotonic_clock::now();
  75.  
  76.                         if(tip_z==POLETANJE)  {this_thread::sleep_for( seconds(3) );}
  77.                             else if(tip_z==SLETANJE){this_thread::sleep_for( seconds(2) );}
  78.  
  79.                             v.zavrsio =monotonic_clock::now();
  80.                             toranj_slobodan=true;
  81.                             mali.notify_one();
  82.                          }
  83.  
  84.                         else if(tip_a==SREDNJI){
  85.  
  86.                             while(toranj_slobodan==false)
  87.                                 srednji.wait(l);
  88.  
  89.                            toranj_slobodan=false;
  90.                             v.odobreno = monotonic_clock::now();
  91.  
  92.                           if(tip_z==POLETANJE){this_thread::sleep_for(seconds(5));}
  93.                              else if(tip_z==SLETANJE){this_thread::sleep_for(seconds(4));}
  94.  
  95.                             v.zavrsio =monotonic_clock::now();
  96.                             toranj_slobodan=true;
  97.                             srednji.notify_one();
  98.                          }
  99.                    else if(tip_a==VELIKI){
  100.                         while(toranj_slobodan==false)
  101.                                 veliki.wait(l);
  102.  
  103.                         toranj_slobodan=false;
  104.                          v.odobreno = monotonic_clock::now();
  105.  
  106.                         if(tip_z==POLETANJE){this_thread::sleep_for(seconds(8));}
  107.                              else if(tip_z==SLETANJE){this_thread::sleep_for(seconds(7));}
  108.  
  109.                             v.zavrsio =monotonic_clock::now();
  110.                             toranj_slobodan=true;
  111.                             veliki.notify_one();
  112.                    }
  113.         return v;
  114.         }
  115.  
  116.         void rasporediPoletanjaISletanja(){
  117.                 unique_lock<mutex>l(m);
  118.                     while(toranj_slobodan==true)
  119.                         toranj.wait(l);
  120.  
  121.                     toranj_slobodan=true;
  122.                     this_thread::sleep_for(seconds(1));
  123.                     toranj.notify_one();
  124.         }
  125.  
  126. };
  127.  
  128. mutex term_mx;
  129.  
  130. void avion(Aerodrom & ae, int broj_aviona, tip_zahteva tip_z, tip_aviona tip_a) {
  131. this_thread::sleep_for(seconds((rand_sync()%10)+1)); //radi slucajnog dolaska aviona na aerodrom
  132. vremena vr = ae.zahtev_aviona(tip_z,tip_a);
  133. duration<double, milli> cekao = vr.odobreno - vr.zatrazio;
  134. duration<double,milli> izvrsavao = vr.zavrsio -vr.odobreno;
  135. lock_guard<mutex> l(term_mx);
  136. cout << "Avion " << broj_aviona << " tipa " << tipoviAviona[tip_a] << " cekao je na odobrenje " << cekao.count() << " milisekundi. "
  137. << nazivi[tip_z][AVION] << " je za " << izvrsavao.count() << " milisekundi. " << endl;
  138.  
  139. }
  140.  
  141. void kontrolniToranj(Aerodrom & ae) {
  142. for (;;) {
  143. ae.rasporediPoletanjaISletanja();
  144. }
  145. }
  146. const size_t UKUPNO=15;
  147. int main(){
  148.     Aerodrom a;
  149.  
  150.     thread t[UKUPNO];
  151.     //void avion(Aerodrom & ae, int broj_aviona, tip_zahteva tip_z, tip_aviona tip_a)
  152.         thread k = thread(kontrolniToranj,ref(a));
  153.         k.detach();
  154.  
  155.             for(size_t i=0; i<UKUPNO; ++i)
  156.                 t[i]= thread(avion, ref(a), i+1, tip_zahteva(i%2), tip_aviona(i%3));
  157.  
  158.             for(size_t i=0; i<UKUPNO; ++i)
  159.                 t[i].join();
  160.  
  161.  
  162.  
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement