Un parcheggio può ospitare motoveicoli e autoveicoli.
I posti disponibili sono 100.
Un motoveicolo occupa 1 posto. Un autoveicolo occupa 2 posti.
Quando i veicoli intendono entrare nel parcheggio, possono essere ammessi nel rispetto delle seguenti regole:
Nel parcheggio non sono ammessi veicoli se non c'è posto sufficiente a ospitarli.
Nel parcheggio sono ammessi al massimo 90 motoveicoli.
Nel parcheggio sono ammessi al massimo 45 autoveicoli.
Chi vuol parcheggiare e non può perché altrimenti verrebbero violate le regole sopra elencate, deve essere messo in attesa.
Scrivere le procedure di ingresso e uscita dal parcheggio per i motoveicoli e per gli autoveicoli.
sem semAuto = 0, semMoto = 0, mutex = 1;
int postiLiberi = 100, attesaAuto = 0, attesaMoto = 0, autoIn = 0, motoIn = 0;
entrataAuto(){
wait(mutex);
if(postiLiberi < 2 || autoIn == 90){
attesaAuto++;
signal(mutex);
wait(semAuto);
wait(mutex);
}
postiLiberi = postiLiberi - 2;
attesaAuto--;
autoIn++;
signal(mutex);
}
entrataMoto(){
wait(mutex);
if(postiLiberi < 1 || motoIn == 45){
attesaMoto++;
signal(mutex);
wait(semMoto);
wait(mutex);
}
postiLiberi--;
attesaMoto--;
motoIn++;
signal(mutex);
}
uscitaAuto(){
wait(mutex);
autoIn--;
postiLiberi = postiLiberi + 2;
if(attesaAuto > 0) signal(attesaAuto);
else if(attesaMoto > 0 && motoIn < 45) signal(attesaMoto);
signal(mutex);
}
uscitaMoto(){
wait(mutex);
motoIn--;
postiLiberi++;
if(attesaAuto > 0 && postiLiberi >= 2) signal(attesaAuto);
else if(attesaMoto > 0) signal(attesaMoto);
signal(mutex);
}
autoveicolo(){entrataAuto(); parcheggia(); uscitaAuto();}
motoveicolo(){entrataMoto(); parcheggia(); uscitaMoto();}