Un distibutore di benzina ha N pompe e 1 serbatoio della capacità di M litri. Ogni automobile all’arrivo richiede una specifica quantità di benzina. Il serbatoio è rifornito da una autobotte che lo riempie fino alla capacità massima e solo se nessuna automobile sta facendo rifornimento.

Le automobili possono fare benzina solo se c’è una pompa libera, se la quantità di benzina richiesta è disponibile e se l’autobotte non sta riempiendo il serbatorio.

Si descriva una soluzione in uno pseudo linguaggio che ottimizzi l’accesso alle risorse usando semafori e processi.

sem distributore = 1;
int occupate = 0;
sem serbatoio = 1;
int disponibile = M;
sem auto = 1;
char autobotte = no;

autobotte(){
	wait(distributore);
		autobotte = si;
	signal(distributore);
	wait(auto);
		riempi();
		disponibile = M;
	signal(auto);
	autobotte = no;
}

automobile(){
	wait(distributore);
	if(occupate < N  && autobotte == no){
		occupate++;
		if(occupate == 1) wait(auto);
		signal(distributore);
		richiesta = rand(1..20);
		wait(serbatoio);
		if(richiesta > disponibile)
			signal(serbatoio)
		else{
			disponibile -= richiesta;
			signal(serbatoio)
			faibenzina();
		}
		wait(distributore);
		occupate--;
		if(occupate == 0)signal(auto);
		signal(distributore);
	}else{
		signal(distributore);
	}
}