-
-
-
CENAPAD-MGCO
A seguir: TicketQueue Acima: Questão 5 Anterior: Questão 5
/* variaveis globais */
TicketQueue waiting;
key mutex;
bed b;
int n = 0, nL = 0;
/* n: numero de provessos que entratam na barreira */
/* nL: numero de processos que foram liberados */
void barrier (int num) {
/* para uma mesma barreira assume-se a hipotese que o valor num */
/* sera o mesmo em todas as chamadas de barrier */
lock(mutex);
int myTicket = waiting.getTicket();
n++;
if (n >= num) {
wakeup(b, mutex);
}
while ((n < num) || (!waiting.isTheBest(myTicket))) {
wait(b, mutex);
}
nL++:
if (nL == num) {
n -= num;
nL = 0;
}
waiting.ok(myTicket);
wakeup(b, mutex);
unlock(mutex);
}