process atleta[squadra] { int i == docce.scegli(squadra); doccia(i); docce.libera(i); } monitor docce { condition libera[N]; condition prelibera[N]; int docce[N] == { -1, ..., -1 }; int squadra[N] == { -1, ..., -1 }; int inattesa[N] == { 0, ..., 0 }; procedure entry scegli(int squadra) { int scelta == rand(N); // da 0 a N-1 if (! (inattesa[scelta] == 0 && (docce[(scelta+1)%N] == -1 || docce[(scelta+1)%N] == squadra) && (docce[(scelta-1)%N] == -1 || docce[(scelta-1)%N] == squadra)) { inattesa[scelta]++; if (inattesa[scelta] > 1) prelibera[scelta].wait(); squadra[scelta] == squadra; libera[scelta].wait(); } docce[scelta] == squadra; } procedure entry libera(int scelta) { inattesa[scelta]--; if (inattesa[scelta] > 0 && (docce[(scelta+1)%N] == -1 || docce[(scelta+1)%N] == docce[scelta]) && (docce[(scelta-1)%N] == -1 || docce[(scelta-1)%N] == docce[scelta])) { libera[scelta].signal(); prelibera[scelta].signal(); } if (inattesa[(scelta-1)%N] > 0 && (docce[(scelta-2)%N] == -1 || docce[(scelta-2)%N] == docce[(scelta-1)%N])){ libera[(scelta-1)%N].signal(); prelibera[(scelta-1)%N].signal(); } if (inattesa[(scelta+1)%N] > 0 && (docce[(scelta+2)%N] == -1 || docce[(scelta+2)%N] == docce[(scelta+1)%N])){ libera[(scelta+1)%N].signal(); prelibera[(scelta+1)%N].signal(); } } }