Advertisement
Guest User

Untitled

a guest
May 6th, 2015
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.08 KB | None | 0 0
  1. /*
  2. Modelovati prvo kolo teniskog turnira koje se odrzava u teniskom klubu sa n terena.
  3. Svaki teren ima svoj broj. (Brojevi su od 1 do n).
  4.  
  5. Na terenima se igraju teniski mecevi prvog kola teniskog turnira. U prvom kolu ucestvuje X takmicara,
  6. tako da ima M = X/2 teniska meca. Za svaki mec u startu se definise na kojem terenu ce biti odigran.
  7. Raspored meceva po terenima pravi se tako da se mecevi ravnomerno rasporede po terenima.
  8. Znaci, na svakom terenu se u proseku igraju n/M meca. Svaki mec ima svoj identifikator (broj).
  9.  
  10. Svaki mec traje slucajan vremenski period izmedju 1 i 5 sekundi. Naredni mec na terenu ne moze da pocne dok
  11. se prethodni mec na tom terenu ne zavrsi.
  12.  
  13. Za svaki mec potrebno je evidentirati kada su takmicari dosli na teren, kada je mec poceo i koliko je mec trajao.
  14.  
  15. Napomene:
  16. Komentari su obavezni.
  17. Za dobijanje slucajnog broja koristiti datu funkciju rand_sync
  18. */
  19.  
  20. #include <iostream>
  21. #include <cstdlib>
  22. #include <thread>
  23. #include <mutex>
  24. #include <condition_variable>
  25. #include <vector>
  26.  
  27. #define MAX_TERENA 40
  28.  
  29. using namespace std;
  30. using namespace chrono;
  31.  
  32. int rand_sync() {
  33. static mutex mx;
  34. unique_lock<mutex> l(mx);
  35. return rand();
  36. }
  37.  
  38. struct podaci {
  39. int brojMeca;
  40. duration<double, milli> trajanje;
  41. system_clock::time_point dosao;
  42. system_clock::time_point pocetak;
  43. };
  44.  
  45. class TeniskiKlub {
  46. bool slobodni[MAX_TERENA];
  47. mutex m;
  48. condition_variable uslovi[MAX_TERENA];
  49. public:
  50. TeniskiKlub(int ukupnoTerena){
  51. for(int i=0; i<ukupnoTerena; i++)
  52. slobodni[i] = true;
  53. }
  54. podaci odigrajMec(int brojMeca, int naTerenu){
  55. podaci p;
  56. p.brojMeca = brojMeca;
  57. {
  58. p.dosao = system_clock::now();
  59. unique_lock<mutex> l(m);
  60. while(!slobodni[naTerenu])
  61. uslovi[naTerenu].wait(l);
  62.  
  63. p.pocetak = system_clock::now();
  64. slobodni[naTerenu] = false;
  65. }
  66. this_thread::sleep_for(seconds(rand_sync()%5+1));
  67. p.trajanje = system_clock::now() - p.pocetak;
  68.  
  69. unique_lock<mutex> l(m);
  70. slobodni[naTerenu] = true;
  71. uslovi[naTerenu].notify_one();
  72.  
  73. return p;
  74. }
  75. };
  76.  
  77. mutex term_mx;
  78.  
  79. void mec(TeniskiKlub& tk, int brojMeca, int naTerenu) {
  80. podaci v = tk.odigrajMec(brojMeca, naTerenu);
  81.  
  82. duration<double, milli> cekao = v.pocetak - v.dosao;
  83. unique_lock<mutex> l(term_mx);
  84. cout << "Mec " << v.brojMeca + 1 << " odigran na terenu " << naTerenu + 1 << " trajao " << v.trajanje.count() << " milisekundi. Takmicari su na pocetak meca cekali " << cekao.count()
  85. << " milisekundi. " << endl;
  86. }
  87.  
  88. const int UKUPNO_TERENA = 3;
  89. const int BROJ_TAKMICARA = 20;
  90.  
  91. int main()
  92. {
  93. int brojMeceva = BROJ_TAKMICARA/2;
  94. TeniskiKlub tk(UKUPNO_TERENA);
  95. thread t[brojMeceva];
  96. for(int i=0; i<brojMeceva; i++)
  97. t[i] = thread(mec, ref(tk), i, i%UKUPNO_TERENA);
  98.  
  99. for(int i=0; i<brojMeceva; i++)
  100. t[i].join();
  101.  
  102. return 0;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement