Advertisement
nex036ara

zad2

May 30th, 2012
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.19 KB | None | 0 0
  1. /*
  2. Modelovati konkurentni program koji simulira ponasanje igracke klik klak.
  3. Ova igracka ima 5 kuglica u sebi. Prva sa zamahom krece leva kuglica koja udara susednu
  4.  desnu do nje i taj udarac se propagira sve do krajnje desne kuglice.
  5.   Svaki pokret kuglice pre udara druge kuglice traje jednu sekundu.
  6.    Nakon ovoga proces se obrce i desna kuglica udara svog levog suseda i
  7.    taj udarac se propagira sve do krajnje leve kuglice. Nakon toga se zavrsava jedan ciklus igre.
  8.  
  9. Nit kuglica treba da simulira ovo ponasanje i prenosenje udaraca sa jedne na drugu kuglicu u oba smera.
  10.  Nakon sto se zavrsi jedan ciklus igre nit kuglica treba da ceka nit igrac koji joj javlja da li
  11.  ima jos da se igra. U suprotnom igra se zavrsava.
  12.  
  13. Nit igrac pokrece minimalno jedan ciklus igracke klik klak (korisnik unosi koliko puta se igra igra),
  14.  a u zavisnosti od prosledjenog parametra moze pokretati igracku N puta (nakon sto se jedan ciklus zavrsi).
  15. */
  16.  
  17. #include<iostream>
  18. #include<thread>
  19. #include<string>
  20.  
  21. using namespace std;
  22. using namespace chrono;
  23.  
  24. int rand_sync() {
  25. static mutex mx;
  26. lock_guard<mutex> l(mx);
  27. return rand();
  28. }
  29.  
  30. class KlikKlak {
  31.    private:
  32.     mutex m;
  33.         size_t brojac_za_poluciklus;
  34.         size_t brojac_za_smer;
  35.         condition_variable ciklus;
  36.         condition_variable kuglice;
  37.  
  38.         size_t kuglice_udarene[5];
  39.         bool strana;
  40.  
  41.     public:
  42.         KlikKlak(): brojac_za_poluciklus(0),brojac_za_smer(0),strana(true) {
  43.         for(size_t i=0; i<5; ++i)
  44.          kuglice_udarene[5]=0;
  45.         }
  46.  
  47.     string udariSusednuKuglicu(int brojKuglice){
  48.             unique_lock<mutex>l(m);
  49.  
  50. //modelujem ponasanje kuglica
  51.  
  52.     while(kuglice_udarene[0]==1){
  53.                 kuglice.wait(l);
  54.                 ciklus.notify_one();
  55.  
  56.     }
  57.                 kuglice_udarene[brojKuglice]++;
  58.  
  59.             if(kuglice_udarene[4]==1){
  60.                 strana = !strana;
  61.                 brojac_za_poluciklus++;
  62.             }
  63.             if(kuglice_udarene[0]==1){
  64.                  strana = !strana;
  65.                 brojac_za_poluciklus++;
  66.             }
  67.             this_thread::sleep_for(seconds(1));
  68.             kuglice.notify_one();
  69.             return strana==false? "LEVU":"DESNU";
  70.     }
  71.     void pokreniCiklus(){
  72.         unique_lock<mutex>l(m);
  73.  
  74.             while(brojac_za_poluciklus!=2)
  75.                        ciklus.wait(l);
  76.  
  77.         for(size_t i=0; i<5; ++i){
  78.         kuglice_udarene[5]=0;
  79.         }
  80.  
  81.                 brojac_za_poluciklus=0;
  82.                 kuglice.notify_one();//probaj one()
  83.     }
  84.  
  85. };
  86.  
  87. mutex term_mx;
  88.  
  89. void Kuglica(KlikKlak & kk, int brojKuglice) {
  90. for (;;) {
  91. string strana = kk.udariSusednuKuglicu(brojKuglice);
  92. lock_guard<mutex> l(term_mx);
  93. cout << "Kuglica broj " << brojKuglice + 1 << " udarila kuglicu " << strana << " od sebe" << endl;
  94. }
  95. }
  96.  
  97. void Igrac(KlikKlak & kk, int brojCiklusa) {
  98. for (int i=0; i<brojCiklusa; i++) {
  99. kk.pokreniCiklus();
  100. }
  101. }
  102.  
  103. int main(){
  104.     KlikKlak KK;
  105.  
  106.     thread kuglice[5];
  107.     for(int i=0;i<5;i++)
  108.         kuglice[i]=thread(Kuglica,ref(KK),i);
  109.     for(int i=0;i<5;i++)
  110.         kuglice[i].detach();
  111.     thread player;
  112.     player=thread(Igrac,ref(KK),1);
  113.     player.join();
  114.  
  115.     return 0;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement