- - - - CENAPAD-MGCO

A seguir: 3a Questão Acima: Gabarito Anterior: 1a Questão


2a Questão

Considere uma ponte estreita, com passagem para um só carro, em uma estrada que permite tráfego em duas mãos, de leste para oeste e no sentido contrário. Um carro que se dirija para leste só pode entrar na ponte se não houver nenhum carro na ponte vindo na direção contrária. Dois ou mais carros podem estar sobre a ponte, desde que estejam trafegando na mesma direção. Programe um sincronizador para a ponte, usado por processos associados aos carros.

O processo carro executa o seguinte programa:

...
bridge.enter(myDirection);
// atravessa a ponte
bridge.leave(myDirection);
...

O objeto bridge é uma instância da classe Bridge:

class Bridge {
  int ncars; // no. carros sobre a ponte
  int currentDirection = EMPTY; // EAST, WEST ou EMPTY
  Key mutex;
  Bed bed;

  void enter(int direction) {
    lock(mutex);
      while (currentDirection == oposite(direction)) {
        wait(bed, mutex);
      }
      ncars++;
      currentDirection = direction;
    unlock(mutex);
  }

  void leave(int direction) {
    lock(mutex);
      ncars--;
      if (ncars == 0) {
        currentDirection = EMPTY;
      }
      wakeup(bed, mutex);
    unlock(mutex);
  }
}

Esta solução pode provocar a inanição de um carro, vítima de um tráfego muito intenso na direção contrária. Não foi feito nenhum esforço para controlar o número de veículos sobre a ponte.



Osvaldo Carvalho - Postscript - Comentários?