In una mensa universitaria gli studenti, dopo aver mangiato, depongono i vassoi in M contenitori, ognuno di K ripiani.

Periodicamente, un addetto alle cucine, sceglie 1 contenitore tra quelli in cui non ci sono più ripiani liberi, lo svuota, lava i piatti e riporta il contenitore in sala.

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

//variabili condivise
int liberi[M] = K;

//semafori
sem cont[M] = 1;

cameriere(){
	int i = -1;
	while(true){
		if(i == M-1) i = 0;
		else i++;

		wait(cont[i]);
		if(liberi[i] == 0){ //il contenitore è pieno
			liberi[i] = K;
			lava();
		}
		signal(cont[i]);
	}
}

studente(){
	i = -1;
	fatto = no;

	while(fatto == no){
		if(i == M-1) i = 0;
		else i++;
		
		wait(cont[i]);
		if(liberi[i] > 0){
			liberi[i] = liberi[i]-1;
			posa();
			fatto = si;
		}
		signal(cont[i];
	}
}