Utrka

U automobilističkoj utrci sudjeluju dva tima s po 3 vozača i svaki tim ima svoj boks, 4 mehaničara i osobu sa zastavicom (lollipop man). Svaki vozač tijekom utrke ulazi u boks svojeg tima na promjenu guma dva puta. Vozač čeka ispred boksa ako je njegov boks zauzet. Nakon što se vozač zaustavi na svom mjestu u boksu, osoba sa zastavicom spušta zastavicu i četvorica mehaničara pristupaju zamjeni kotača (naravno, može se dogoditi da istovremeno mehaničari u oba boksa mijenjaju gume). Kada mehaničar završi svoj posao, javlja osobi sa zastavicom i nakon što sva četvorica mehaničara zamijene svaki svoj kotač osoba sa zastavicom diže zastavicu i time pušta vozača natrag u utrku. Pretpostavlja se da mehaničari i osoba sa zastavicom završe s radom kada dvaput zamijene gume svakom vozaču jer su imali pripremljeni samo dva seta guma po vozilu.

Zadatak

Simulirati utrku dva tima s po 3 dretve vozača, 4 dretve mehaničara i jednom dretvom osoba_sa_zastavicom. Sve navedene dretve stvara glavna dretva programa. Dretve sinkronizirati monitorima.

Sve što u zadatku nije zadano, riješiti na proizvoljan način.

glavna dretva(){
   stvori 6 dretvi vozača, 8 dretvi mehaničara i 2 dretve lollipop man;
   označi početak utrke;
}


dretva vozač(){
   čekaj početak utrke;
   vozi x milisekundi gdje je x slučajan broj između 2000 i 5000 ms;
   idi u boks zamijeniti gume;
   vozi (7000 - x)ms;
   idi u boks zamijeniti gume;
   vozi y milisekundi gdje je y slučajan broj između 2000 i 3000 ms;
   ispiši završio utrku;
}

dretva mehaničar(){
   dok traje utrka{
      čekaj dok osoba sa zastavicom da znak da se mogu mijenjati gume;
      zamijeni_kotač; // simulirati čekanjem z milisekundi gdje je z slučajan broj između 2000 i 4000 ms
      javi lollipop manu da je kotač zamijenjen;
   }
}

dretva osoba_sa_zastavicom(){ // osoba sa zastavicom
   dok traje utrka{
      pokaži zastavicom vozaču da može doći promijeniti gume;
      čekaj dok se vozač ne zaustavi;
      spusti zastavicu;
      čekaj dok mehaničari ne zamijene kotače;
      podigni zastavicu;
   }
}
"Spavanje" u milisekundama može se postići funkcijom usleep(ms*1000) koja odgađa izvođenje programa za zadani broj mikrosekundi.