-
-
-
CENAPAD-MGCO
A seguir: 3a. Questao Acima: Cristiano Ligieri Pereira Anterior: 1a Questão
requestBridge(int direction); /* atravessa a ponte */ releaseBridge(int direction);
key mutex;
TicketQueue waiting;
Bed b;
int ne = 0, nw = 0;
void requestBridgeToEast() {
lock(mutex);
int myticket = waiting.getTicket();
while (rw > 0 || ! waiting.isTheBest(myTicket))
wait(b, mutex);
ne++;
waiting.ok(myTicket);
unlock(mutex);
}
void requestBridgeToWest() {
lock(mutex);
int myticket = waiting.getTicket();
while (ne > 0 || ! waiting.isTheBest(myTicket))
wait(b, mutex);
rw++;
waiting.ok(myTicket);
unlock(mutex);
}
void releaseBridgeToEast() {
lock(mutex);
ne--;
wakeup(b, mutex);
unlock(mutex);
}
void releaseBridgeToWest() {
lock(mutex);
nw--;
wakeup(b, mutex);
unlock(mutex);
}
void requestBridge(int direction) {
if (direction == EAST)
requestBridgeToEast();
else
requestBridgeToWest();
}
void releaseBridge(int direction) {
if (direction == EAST)
releaseBridgeToEast();
else
releaseBridgeToWest();
}
Implementacao da fila de tickets:
int ticket = 0;
OrderedQueue q;
int getTicket() {
q.put(++ticket);
return ticket;
}
bool isTheBest(int ticket) {
if (q.top() != NULL) {
return (ticket == q.top());
}
return TRUE;
}
void ok(int ticket) {
if (ticket != q.pop()) {
ERROR();
}
}