Advertisement
nex036ara

atleta

May 28th, 2012
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.22 KB | None | 0 0
  1. /*********************
  2.  
  3. Modelovati klasu AtletskoOkupljanje
  4.  
  5. Na Atletskom okupljanju postoje 2 vrste aktivnosti, tj takmicara.
  6. Postoje bacaci koplja i skakaci u dalj.
  7. Svi takmicari za svoje vrsenje aktivnosti koriste ZALETISTE
  8. SAmo 1 takmicar moze u jednom trenutku da ga koristi, drugi moraju da cekaju dok ne bude slobodno
  9. Takmicari vrse svoje aktivnosti naizmenicno jedan u odnosu na drugog.
  10.  
  11. Bacaci koplja bacaju koplje na daljinu od 0 do 100 metara
  12. Bacanje koplja traje 2 sekunde
  13.  
  14. Skakaci skacu od 0 do 9 metara
  15. Skakanje traje 1 sekundu.
  16.  
  17. Neophodno je izmeriti ukupno trajanje aktivnosti takmicara
  18. ( cekanje+ skok/bacanje)
  19.  
  20. Ponasanje skakaca opisuje funkcija skakac
  21. Ponasanje bacaca opisuje funkcija bacac
  22.  
  23. ***********************************/
  24.  
  25. #include<iostream>
  26. #include<thread>
  27. #include<string>
  28. #include<cstdlib>
  29. using namespace std;
  30. using namespace chrono;
  31.  
  32.  
  33. int rand_sync() {
  34.         static mutex mx;
  35.         lock_guard<mutex> l(mx);
  36.         return rand();
  37. }
  38.  
  39. struct povratna_vrednost{
  40.     int duzina;
  41.     duration<double, milli> trajanje;
  42.     monotonic_clock::time_point dosao;
  43.     monotonic_clock::time_point poceo;
  44.     monotonic_clock::time_point zavrsio;
  45.     duration<double, milli> cekanje;
  46.     duration<double, milli> servis;
  47.  
  48.     };
  49.  
  50.     enum NaRedu{SKAKAC=0,BACAC};
  51.  
  52. class AltetskoOkupljanje{
  53.     private:
  54.         mutex m;
  55.         condition_variable bacaci;
  56.         condition_variable skakaci;
  57.  
  58.         bool zaletiste_slobodno;
  59.  
  60.         NaRedu enum_na_redu;
  61.  
  62.         size_t broj_niti_skakaca;
  63.         size_t broj_niti_bacaca;
  64.  
  65.     public:
  66.     AltetskoOkupljanje(size_t skakaci, size_t bacaci){
  67.      broj_niti_skakaca=skakaci;
  68.       broj_niti_bacaca=bacaci;
  69.        enum_na_redu=SKAKAC;
  70.         zaletiste_slobodno=true;
  71.         }
  72.  
  73.     povratna_vrednost skoci(){
  74.  
  75.  
  76.         povratna_vrednost pov;
  77.             pov.dosao = monotonic_clock::now();
  78.                 {
  79.                 unique_lock<mutex>l(m);
  80.                 while(enum_na_redu!=SKAKAC || zaletiste_slobodno==false){
  81.                     skakaci.wait(l);
  82.                 }
  83.  
  84.                 zaletiste_slobodno = false;
  85.                 pov.poceo = monotonic_clock::now();
  86.                 pov.duzina = rand_sync()%10;
  87.  
  88.                 this_thread::sleep_for(seconds(1));
  89.                 pov.zavrsio =  monotonic_clock::now();
  90.                  broj_niti_skakaca--;
  91.  
  92.  
  93.                 if(broj_niti_bacaca>0){
  94.                 enum_na_redu =BACAC;
  95.                 zaletiste_slobodno=true;
  96.                 bacaci.notify_one();
  97.                 } else
  98.                     {
  99.                     zaletiste_slobodno=true;
  100.                     skakaci.notify_one();
  101.                     }
  102.  
  103.                 }
  104.                 pov.cekanje = pov.poceo-pov.dosao;
  105.                 pov.servis = pov.zavrsio-pov.poceo;
  106.                 pov.trajanje = pov.cekanje+pov.servis;
  107.                 return pov;
  108.  
  109.     }
  110.  
  111.     povratna_vrednost BaciKoplje(){
  112.         povratna_vrednost pov;
  113.                pov.dosao = monotonic_clock::now();
  114.  
  115.        {
  116.         unique_lock<mutex>l(m);
  117.                 while(enum_na_redu!=BACAC || zaletiste_slobodno==false)
  118.                     bacaci.wait(l);
  119.  
  120.                 zaletiste_slobodno = false;
  121.                 pov.poceo = monotonic_clock::now();
  122.                 pov.duzina = rand_sync()%101;
  123.  
  124.                 this_thread::sleep_for(seconds(2));
  125.                 pov.zavrsio =  monotonic_clock::now();
  126.                  broj_niti_bacaca--;
  127.  
  128.  
  129.  
  130.                 if(broj_niti_skakaca>0){
  131.                 enum_na_redu =SKAKAC;
  132.                 zaletiste_slobodno=true;
  133.                 skakaci.notify_one();
  134.                 } else
  135.                     {
  136.                     zaletiste_slobodno=true;
  137.                     bacaci.notify_one();
  138.                     }
  139.  
  140.  
  141.        }
  142.  
  143.                 pov.cekanje = pov.poceo-pov.dosao;
  144.                 pov.servis = pov.zavrsio-pov.poceo;
  145.                 pov.trajanje = pov.cekanje+pov.servis;
  146.                 return pov;
  147.  
  148.  
  149.     }
  150. };
  151.  
  152. mutex term_m;
  153.     void skakac ( AltetskoOkupljanje& ao, size_t redni_Br){
  154.     povratna_vrednost p;
  155.     p=ao.skoci();
  156.     duration<double, milli> ukupno=p.trajanje;
  157.     lock_guard<mutex> l(term_m);
  158.     cout<<"Takmicar br " << redni_Br<< "skocio: " << p.duzina << "m, ukupna aktivnost u milisekundama: "
  159.     << ukupno.count() << endl;
  160.     }
  161.  
  162. void bacac ( AltetskoOkupljanje& ao, size_t redni_Br){
  163.     povratna_vrednost p;
  164.     p=ao.BaciKoplje();
  165.     duration<double, milli> ukupno=p.trajanje;
  166.     lock_guard<mutex> l(term_m);
  167.     cout<<"Takmicar br " << redni_Br<< "bacio: " << p.duzina << "m, ukupna aktivnost u milisekundama: "
  168.     << ukupno.count() << endl;
  169. }
  170.  
  171. const size_t SKAKACI=3;
  172. const size_t BACACI=6;
  173. const size_t UKUPNO = SKAKACI+BACACI;
  174. int main(){
  175.     AltetskoOkupljanje ao(SKAKACI,BACACI);
  176.     thread skakaci[SKAKACI];
  177.     thread bacaci[BACACI];
  178.  
  179.     for(size_t i=0; i<SKAKACI; ++i){
  180.         skakaci[i]=thread(skakac, ref(ao), i+1);
  181.     }
  182.     for(size_t i=0; i<BACACI; ++i){
  183.         bacaci[i]=thread(bacac, ref(ao), i+1);
  184.     }
  185.  
  186.     for(size_t i=0; i<SKAKACI; ++i){
  187.         skakaci[i].join();
  188.     }
  189.     for(size_t i=0; i<BACACI; ++i){
  190.         bacaci[i].join();
  191.     }
  192.  
  193.     cout<< "KRAJ PROGRAMA"<<endl;
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement