-
-
-
CENAPAD-MGCO
A seguir: 3a Questão Acima: Elaine Gouvea Pimentel Anterior: 1a Questão
char direcao;
key mutex;
bed b;
int nL=0; int nO=0;
TicketQueue waiting;
/* Em primeiro lugar, separamos a requisi\c{c}\~ao de acesso de
acordo com a direcao do vehiculo: se vai para leste(L) ou oeste(O) */
void requestAccess (direcao){
lock(mutex);
int myTicket = getTicket();
if direcao == L {
requestAccessL;
}
else {
requestAccessO;
}
}
void requestAccessL(){
while nO > 0 || (!isTheBest(myTicket)){
wait(b, mutex);
}
nL++;
ok(myTicket);
wakeup(b, mutex);
unlock(mutex);
}
void requestAccessO(){
while nL > 0 || (!isTheBest(myTicket)){
wait(b, mutex);
}
nO++;
ok(myTicket);
wakeup(b, mutex);
unlock(mutex);
}
void releaseAccess(direcao){
lock(mutex);
if direcao = L {
nL--;
}
else {
nO --;
}
wakeup(b, mutex);
unlock(mutex);
}
Os procedimentos getTicket, isTheBest e ok são como descritos nas notas de
aula.