- - - - CENAPAD-MGCO

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


4a Questão

Uma barbearia consiste de uma sala de espera com n cadeiras comuns, e de uma única cadeira de barbeiro. O barbeiro atende a um cliente de cada vez. Se um cliente entra na barbearia e todas as cadeiras estão ocupadas, ele vai embora. Se o barbeiro está ocupado mas existem cadeiras comuns disponíveis, o cliente espera usando uma cadeira. Programe um sincronizador para a barbearia, usado pelo processo barbeiro e por processos clientes.

/* cliente */
loop
  ...
  if (barbershop.enter()) {
    /* conseguiu entrar, tendo talvez esperado em uma cadeira */
    /* faz a barba */
    barbershop.leave();
  } else {
    /* nao conseguiu; as cadeiras estavam ocupadas */
  }
  ...
end

class Barbershop {
  int nchairs = 0;
  
  boolean enter() {
    lock(mutex);
      
      if (nchairs >= 4) {
        return false;
      }
      nchairs++
      while (barberBusy) {
        wait(bed, mutex);
      } 
      nchairs--;
      return true;
    unlock(mutex);
  }
  void leave() {
    lock(mutex);
      barberBusy = false;
      wakeup(bed,mutex);
    unlock(mutex);
  }
}



Osvaldo Carvalho - Postscript - Comentários?