Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Modelovati konkurentni program koji simulira ponasanje igracke klik klak.
- Ova igracka ima 5 kuglica u sebi. Prva sa zamahom krece leva kuglica koja udara susednu
- desnu do nje i taj udarac se propagira sve do krajnje desne kuglice.
- Svaki pokret kuglice pre udara druge kuglice traje jednu sekundu.
- Nakon ovoga proces se obrce i desna kuglica udara svog levog suseda i
- taj udarac se propagira sve do krajnje leve kuglice. Nakon toga se zavrsava jedan ciklus igre.
- Nit kuglica treba da simulira ovo ponasanje i prenosenje udaraca sa jedne na drugu kuglicu u oba smera.
- Nakon sto se zavrsi jedan ciklus igre nit kuglica treba da ceka nit igrac koji joj javlja da li
- ima jos da se igra. U suprotnom igra se zavrsava.
- Nit igrac pokrece minimalno jedan ciklus igracke klik klak (korisnik unosi koliko puta se igra igra),
- a u zavisnosti od prosledjenog parametra moze pokretati igracku N puta (nakon sto se jedan ciklus zavrsi).
- */
- #include<iostream>
- #include<thread>
- #include<string>
- using namespace std;
- using namespace chrono;
- int rand_sync() {
- static mutex mx;
- lock_guard<mutex> l(mx);
- return rand();
- }
- class KlikKlak {
- private:
- mutex m;
- size_t brojac_za_poluciklus;
- size_t brojac_za_smer;
- condition_variable ciklus;
- condition_variable kuglice;
- size_t kuglice_udarene[5];
- bool strana;
- public:
- KlikKlak(): brojac_za_poluciklus(0),brojac_za_smer(0),strana(true) {
- for(size_t i=0; i<5; ++i)
- kuglice_udarene[5]=0;
- }
- string udariSusednuKuglicu(int brojKuglice){
- unique_lock<mutex>l(m);
- //modelujem ponasanje kuglica
- while(kuglice_udarene[0]==1){
- kuglice.wait(l);
- ciklus.notify_one();
- }
- kuglice_udarene[brojKuglice]++;
- if(kuglice_udarene[4]==1){
- strana = !strana;
- brojac_za_poluciklus++;
- }
- if(kuglice_udarene[0]==1){
- strana = !strana;
- brojac_za_poluciklus++;
- }
- this_thread::sleep_for(seconds(1));
- kuglice.notify_one();
- return strana==false? "LEVU":"DESNU";
- }
- void pokreniCiklus(){
- unique_lock<mutex>l(m);
- while(brojac_za_poluciklus!=2)
- ciklus.wait(l);
- for(size_t i=0; i<5; ++i){
- kuglice_udarene[5]=0;
- }
- brojac_za_poluciklus=0;
- kuglice.notify_one();//probaj one()
- }
- };
- mutex term_mx;
- void Kuglica(KlikKlak & kk, int brojKuglice) {
- for (;;) {
- string strana = kk.udariSusednuKuglicu(brojKuglice);
- lock_guard<mutex> l(term_mx);
- cout << "Kuglica broj " << brojKuglice + 1 << " udarila kuglicu " << strana << " od sebe" << endl;
- }
- }
- void Igrac(KlikKlak & kk, int brojCiklusa) {
- for (int i=0; i<brojCiklusa; i++) {
- kk.pokreniCiklus();
- }
- }
- int main(){
- KlikKlak KK;
- thread kuglice[5];
- for(int i=0;i<5;i++)
- kuglice[i]=thread(Kuglica,ref(KK),i);
- for(int i=0;i<5;i++)
- kuglice[i].detach();
- thread player;
- player=thread(Igrac,ref(KK),1);
- player.join();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement