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:

  1. Nel parcheggio non sono ammessi veicoli se non c'è posto sufficiente a ospitarli.

  2. Nel parcheggio sono ammessi al massimo 90 motoveicoli.

  3. 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();}