Djed Božićnjak

Zadatak

Djed Božićnjak spava u svojoj kući na Sjevernom polu i može ga se probuditi tek kada mu se vrati svih 10 sobova koji su na zasluženom odmoru (preciznije posljednji sob budi Djeda Božićnjaka). Djed Božićnjak nahrani sobove i ponovo odlazi spavati, a sobovi ostaju pred kućom. Djedovo buđenje mogu izazvati i patuljci koji imaju poteškoća prilikom izrade igračaka. Ako samo jedan patuljak ima problem, to nije toliko ozbiljno da bi probudio Djeda Božićnjaka pa zato patuljci posjećuju Djeda Božićnjaka u grupama po 3. Patuljci kod Djeda Božićnjaka provedu određeno vrijeme te se nakon toga vrate pravljenju igračaka, a Djed Božićnjak spavanju. Samo jedna grupa patuljaka može u nekom trenutku biti kod Djeda Božićnjaka, dok ostali moraju čekati da se ta grupa ne vrati. Ako se Djed Božićnjak probudi i ispred vrata vidi grupu patuljaka (može i manje od tri) i sve sobove, došlo je vrijeme za razvoženje poklona. Nakon razvoženja poklona Djed Božićnjak će sobove pustiti na odmor.
Napisati program koji simulira gore navedene radnje pazeći na specifičnosti svakog od likova. Ispis programa mora biti detaljan. Za svakog "aktera" predvidjeti po jednu dretvu/proces.
Dretva Djed Božičnjak je ciklička dretva i stvara se jednom na samom početku programa. Dretve za sobove i patuljke nisu cikličke (završavaju nakon obavljanja funkcije dretve) i stvaraju se dinamički (svake 2-3 sekunde jedan novi sob ili patuljak). Nakon što je stvoreno 10 dretvi sobova, nove dretve sobovi se ne stvaraju sve dok ovih 10 ne završi (nakon raznošenja poklona). Sve navedeno vrijedi i za rješenje s dretvama i s procesima.

Djed() {
   while(1) {
      spavaj;
      neko ga probudio;

      ako(svi sobovi pred vratima i ima patuljaka) {
         ukrcaj_poklone_i_raznosi;
         pošalji sobove na godišnji;
      }

      ako (svi sobovi pred vratima)
         nahrani_sobove;

 
    ako(3 patuljka pred vratima)
         riješi_njihov_problem;

   }
}

 
Patuljak() {
   odi do djeda po pomoc i pričekaj ga;
   obavi konzultacije;
}

Sob() {
   ako si ti 10-ti sob probudi djeda;
   čekaj pred vratima dok te djed ne pozove;
   raznosi poklone;

}

Primjer rješenja sa semaforima i s monitorima.