Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Modelovati prvo kolo teniskog turnira koje se odrzava u teniskom klubu sa n terena.
- Svaki teren ima svoj broj. (Brojevi su od 1 do n).
- Na terenima se igraju teniski mecevi prvog kola teniskog turnira. U prvom kolu ucestvuje X takmicara,
- tako da ima M = X/2 teniska meca. Za svaki mec u startu se definise na kojem terenu ce biti odigran.
- Raspored meceva po terenima pravi se tako da se mecevi ravnomerno rasporede po terenima.
- Znaci, na svakom terenu se u proseku igraju n/M meca. Svaki mec ima svoj identifikator (broj).
- Svaki mec traje slucajan vremenski period izmedju 1 i 5 sekundi. Naredni mec na terenu ne moze da pocne dok
- se prethodni mec na tom terenu ne zavrsi.
- Za svaki mec potrebno je evidentirati kada su takmicari dosli na teren, kada je mec poceo i koliko je mec trajao.
- Napomene:
- Komentari su obavezni.
- Za dobijanje slucajnog broja koristiti datu funkciju rand_sync
- */
- #include <iostream>
- #include <cstdlib>
- #include <thread>
- #include <mutex>
- #include <condition_variable>
- #include <vector>
- #define MAX_TERENA 40
- using namespace std;
- using namespace chrono;
- int rand_sync() {
- static mutex mx;
- unique_lock<mutex> l(mx);
- return rand();
- }
- struct podaci {
- int brojMeca;
- duration<double, milli> trajanje;
- system_clock::time_point dosao;
- system_clock::time_point pocetak;
- };
- class TeniskiKlub {
- bool slobodni[MAX_TERENA];
- mutex m;
- condition_variable uslovi[MAX_TERENA];
- public:
- TeniskiKlub(int ukupnoTerena){
- for(int i=0; i<ukupnoTerena; i++)
- slobodni[i] = true;
- }
- podaci odigrajMec(int brojMeca, int naTerenu){
- podaci p;
- p.brojMeca = brojMeca;
- {
- p.dosao = system_clock::now();
- unique_lock<mutex> l(m);
- while(!slobodni[naTerenu])
- uslovi[naTerenu].wait(l);
- p.pocetak = system_clock::now();
- slobodni[naTerenu] = false;
- }
- this_thread::sleep_for(seconds(rand_sync()%5+1));
- p.trajanje = system_clock::now() - p.pocetak;
- unique_lock<mutex> l(m);
- slobodni[naTerenu] = true;
- uslovi[naTerenu].notify_one();
- return p;
- }
- };
- mutex term_mx;
- void mec(TeniskiKlub& tk, int brojMeca, int naTerenu) {
- podaci v = tk.odigrajMec(brojMeca, naTerenu);
- duration<double, milli> cekao = v.pocetak - v.dosao;
- unique_lock<mutex> l(term_mx);
- cout << "Mec " << v.brojMeca + 1 << " odigran na terenu " << naTerenu + 1 << " trajao " << v.trajanje.count() << " milisekundi. Takmicari su na pocetak meca cekali " << cekao.count()
- << " milisekundi. " << endl;
- }
- const int UKUPNO_TERENA = 3;
- const int BROJ_TAKMICARA = 20;
- int main()
- {
- int brojMeceva = BROJ_TAKMICARA/2;
- TeniskiKlub tk(UKUPNO_TERENA);
- thread t[brojMeceva];
- for(int i=0; i<brojMeceva; i++)
- t[i] = thread(mec, ref(tk), i, i%UKUPNO_TERENA);
- for(int i=0; i<brojMeceva; i++)
- t[i].join();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement