Pročitao sam malo na internetu opis monitora i uslovne promenljive. Uslovna promanljiva je objekat nad kojim se čeka, ali to funkcioniše samo unutar monitora, što je modul (skup podataka i funkcija vezanih za njih). Za čekanje na preuzimanje kontrole koristi se cwait, za prepuštanje kontrole koristi se csignal. To mi liči na kritične sekcije iz Windows okruženja (EnterCriticalSection, LeaveCriticalSection). Ako nije tako onda je možda ostatak teksta pogrešan.
Imamo procese (u Windowsu se zovu niti, threads) u sistemu, i to dve vrste, Decu i Roditelje. Ne znam kako se pravi proces u M2, nadam se da ti znaš. Oba tipa procesa potroše malo vremena u zabavištu, zatim malo kod kuće, i tako u krug. Razlika je što je Deci ograničeno da uđu u zabavište, a Roditeljima da ga napuste. I jedni i drugi ne mogu da promene svoje stanje ako bi se time narušila nejednakost 3*R >= D. gde su R i D broj roditelja i dece u zabavištu. Ako neki proces želi da promeni stanje, ali ne može zbog ove nejednakosti onda mora da čeka, dok se ne steknu povoljniji uslovi. Čekanje se radi sa cwait. Ti uslovi mogu da se steknu samo ako neki Roditelj dođe, ili neko Dete ode iz zabavišta. Kad god se to desi treba da se pozove csignal.
E sad, kako napraviti program od ovog? Napiši ovde kostur programa koji pokreće 10 Dece i 4 Roditelja, svih 14 sa stanjem "u zabavištu" (obična promenljiva koja može da ima jednu od dve vrednosti). Tamo gde se izvršava Dete trebalo bi da stoji ovako nešto:
Code:
ponavljaj sledeće dok ne dođe vreme za kraj rada:
sačekaj malo
ako <stanje je "dete u zabavištu"> onda
promeni stanje u "dete van zabavišta"
csignal(c)
inače
dokle god <dete ne može u zabavište>
cwait(c)
promeni stanje u "dete u zabavištu";
Za Roditelje je slično, samo suprotno:
Code:
ponavljaj sledeće dok ne dođe vreme za kraj rada:
sačekaj malo
ako <stanje je "roditelj van zabavišta"> onda
promeni stanje u "roditelj u zabavištu"
csignal(c)
inače
dokle god <roditelj ne može iz zabavišta>
cwait(c)
promeni stanje u "roditelj van zabavištu";
Svaka promena stanja bi trebala da se ispisuje na ekranu, zajedno sa ukupnim brojem Dece i Roditelja u zabavištu. Glavni proces bi trebao da čeka neko duže vreme dok traje simulacija, a onda da kaže svim procesima da završe rad, i da čeka da svi završe, da bi mogao i sam da završi. Ovaj detalj ne znam kako bih rešio, kako se u M2 čeka na kraj pokrenutog procesa, nadam se da ti znaš.