semaphore Mutex = 1; semaphore c[N] = {0, ...., 0}; semaphore urgent = 0; int urgentno = 0; int nc[N] = {0, ..., 0}; enter() { P(Mutex); } exit() { if (urgentno > 0) { urgentno--; V(urgent); // passaggio del testimone } else V(Mutex); } wait(i) { nc[i]++; exit(); c[i].P(); // riottengo il testimone } signal(i) { if (nc[i] > 0) { nc[i]--; V(c[i]); // passaggio del testimone urgentno++; P(urgent); // riottengo il testimone } }