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];
}
}