Un parcheggio ha 30 posti, due ingressi con sbarra A e B, ed un’uscita.
Quando un veicolo si presenta ad uno dei due ingressi, se c’è almeno un posto libero entra, parcheggia ed esce dal parcheggio, altrimenti prenota l’ingresso ed attende di poter entrare.
Se ci sono veicoli in attesa ad entrambi gli ingressi, vengono fatti entrare quando altri veicoli escono dal parcheggio, aprendo le due sbarre alternativamente.
Quando un veicolo esce dal parcheggio, se ci sono veicoli in attesa ad almeno uno dei due ingressi, ne fa entrare uno.
semaphore mutex = 1, sbarraA = 0, sbarraB = 0;
int postiLiberi = 30, bookA = 0, bookB = 0, turno = 0;
entraIngressoA(){
wait(mutex);
if(postiLiberi > 0){
postiLiberi--;
signal(mutex);
}else{
bookA++;
signal(mutex);
wait(sbarraA);
}
}
entraIngressoB(){
wait(mutex);
if(postiLiberi > 0){
postiLiberi--;
signal(mutex);
}else{
bookB++;
signal(mutex);
wait(sbarraB);
}
}
esci(){
wait(mutex);
if(postiLiberi == 0){
if((tuno == 0 || bookB == 0) && bookA > 0){
bookA--;
turno = 1;
signal(sbarraA);
}else{
if(bookB > 0){
bookB--;
turno = 0;
signal(sbarraB);
}else{
postiLiberi++;
}
}
}else{
postiLiberi++;
}
signal(mutex);
}
inA(){
entraIngressoA();
parcheggia();
esci();
}
inB(){
entraIngressoB();
parcheggia();
esci();
}