liftovi
void passenger(unsigned ID, x, y){ // x-sprat na kome se putnik nalazi,
y-gde zeli da ide
int s1, s2;
if(x != y){ //logicno
PROTOKOL POZIVA LIFTA
in("start", x, ?s1); // ucitaj u s1 broj putnika koji cekaju na mom
spratu
if(s1 == 0) out("floor", x);
// ako sam prvi, pritisnem dugme da pozovem lift na moj sprat (ne
zovu svi!) ovo se radi atomicno, jer je u kriticnoj sekciji zbog
prethodnog reda
out("start", x, s1+1); // uvecam broj onih koji cekaju sa mnom za 1,
jer sam stigao, i oslobadjam kriticnu sekciju
PROTOKOL ULASKA U LIFT
in("on", x); // cekam da mi lift javi da je dosao na moj sprat
in("start", x, ?s1); // ucitaj u s1 broj putnika koji cekaju na mom
spratu
in("stop", y, ?s2); // ucitaj u s2 broj onih koji hoce na sprat y
if(s2 == 0) out("floor", y); // ako sam prvi koji zeli na Y,
pritisnem dugme u liftu, tj. javim liftu da treba nekoga da ostavi na
spratu y
inp("floor", x); // pokupim prvobitni poziv lifta da dodje na sprat
x. Posto je samo 1 pritisnuo dugme, samo jedan ce i da pokupi, zato je
inp, da ne bude blokirajuci. Tacnije maksimalno jedan putnik ce da
pokupi ovaj zahtev. Ovo je neophodno, jer je mozda lift stao na spratu
x ne zato sto smo ga mi pozvali pa je ispostovao nas zahtev, vec je
mozda i neko hteo da tu sidje, pa se mora u svakom sluchaju izbaciti
zahtev vishka ako postoji
out("stop", y, s2+1); // uvecavam broj onih koji zele na y za 1
out("start", x, s1-1); // smanjim broj onih koji se nalaze na x-u za
jedan
out("on", x); // da i drugi mogu da udju u lift
PROTOKOL IZLASKA IZ LIFTA
in("off", y); //cekam da se lift zaustavi na spratu . Ovo nije isto
kao i in("on", x), jer on javlja onima koji treba da udju, a off onima
koji treba da izadju. Prvo se izlazi iz lifta, pa se oda ulazi
in("stop", y, ?s2); ucitam u s2 broj onih koji treba da izadju na
spratu y
inp("floor", y); //pokupim zahtev za sprat y (ovo ce uraditi samo prvi
koji izadje, i to ne uvek, vec samo ako je neko u medjuvremenu pozvao
lift sa sprata y)
out("stop", y, s2-1); // smanjim broj onih koji treba da izadju
out("off", y); // pustam i ostale da izadju
} // if
} // passenger
void elevator(){
int x;
while(1){
x = getFloor(); // lift bira sledeci sprat na koji ce da ide medju
raspolozivim zahtevima
ISTERAVANJE PUTNIKA NAPOLJE
out("off", x); // javlja onima koji treba da sidju na ovom spratu
da se zaustavio na tom spratu
in("stop", x, 0); // ceka da svi putnici izadju (da s2 bude nula, u
kodu putnika)
in("off", x); // kad su svi izasli, kaze da vise nije na x-u. kad
ne bi bilo ovoga, putnik koji kasnije udje na spratu z, a hoce na
sprat x, mogao bi da izadje iz lifta dok lift jos putuje ka nekom
desetom spratu w.
out("stop", x, 0); // vrati nulu kao broj onih koji trerba da
izadju na spratu x, neophodnu u algoritmu putnika
ULAZAK PUTNIKA
out("on", x); // kaze da je stigao na sprati x, ali sada onima koji
treba da udju
in("start", x, 0); // ceka da svi udju (tj. da s1 bude nula u kodu
putnika)
in("on", x); // kad je pokupio sve, kaze putnicima koji cekaju na
spratu x da vise nije na x-u (neophodno zbog sinhronizacije sa
putnicima koji eventualno dodju kad lift ode, inace bi
novopridosli putnik usao u lift koga nema)
out("start", x, 0); // vrati nulu kao broj onih koji trerba da udju
na spratu x, neophodnu u algoritmu putnika
} //while
} //elevator
int getFloor(){ // trivijalan algoritam izbora sprata na koji ce lift
sledeci da ode. Bolji algoritam pravi strategiju obilaska spratova (npr
prvo u jedom smeru, pa u drugom, da ne ide cik cak)
int x;
in("floor", ?x);
return x; // nedostaje u materijalima
}
void init(){
int broj_spratova=30;
int i;
for(i=0; i<broj_spratova; i++){
out("start", i, 0);
out("stop", i, 0);
}
eval( elevator());
// putnici neka dodju usput
}
- Follow-Ups:
- Re: liftovi
- From: "Albin Ramovic" <albinramovic@gmail.com>
- Re: liftovi
Previous by date: 1. i 3. zadatak
Next by date: Re: Greske ili... ?
Previous by thread: Re: Monitori Next by thread: Re: liftovi
Previous by thread: Re: Monitori Next by thread: Re: liftovi