- - - - CENAPAD-MGCO

A seguir: 3a. Questao Acima: Cristiano Ligieri Pereira Anterior: 1a Questão


2a Questão

Um carro, antes de atravessar a ponte, deve pedir permissao para faze-lo da seguinte forma:

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();
  }
}



Osvaldo Carvalho - Postscript - Comentários?