process atleta[squadra] { int i = docce.scegli(squadra); doccia(i); docce.libera(i,squadra); } monitor docce { condition libera[N], prelibera[N]; int docce[N] = { -1, ..., -1}; // chi occupa l'i-esima doccia int squadra[N]; // il giocatore in attesa della doccia i e' della squadra squadra[i] int inattesa[N] = { 0, ..., 0 } // quanti in attesa per la doccia i-esima procedure entry scegli(int squadra) { int scelta = rand(N); if(inattesa[scelta] = 0 && docce[scelta] = 0 && (docce[scelta+1] = 0 || docce[scelta+1]=squadra) && (docce[scelta-1] = 0 || docce[scelta-1]=squadra) {} else { if(inattesa[scelta] > 0) prelibera[scelta].wait(); squadra[scelta] = squadra; libera[scelta].wait(); } docce[scelta] = squadra; } procedure entry libera(i,squadra) { docce[i] = -1; if (inattesa[i] > 0 && (squadra[i] = docce[i+1] || docce[i+1] = -1) && (squadra[i] = docce[i-1] || docce[i-1] = -1)) { libera[i].signal(); prelibera[i].signal() } if (inattesa[i-1] > 0 && (squadra[i-1] = docce[i-2] || docce[i-2] = -1)) { libera[i-1].signal(); prelibera[i-1].signal() } if (inattesa[i+1] > 0 && (squadra[i+1] = docce[i+2] || docce[i+2] = -1)) { libera[i+1].signal(); prelibera[i+1].signal() } } }