- - - - CENAPAD-MGCO

A seguir: 5a Questão Acima: Sidney Batista Filho Anterior: 3a Questão


4a Questão

Processo barbeiro:

...
loop
  BarberShop.RequestClient();
    /* corta o cabelo */
  BarberShop.ReleaseClient();
endloop
...

Processos Clientes:

...
boolean IsFull;
IsFull = BarberShop.RequestBarber();
if (!IsFull) {
  /* corta o cabelo */
  BarberShop.ReleaseBarber();
}
...

class CBarberShop {
  Key Mutex;
  CBed ClientBed, BarberBed;
  int n = 5;             // no. de cadeiras para os clientes esperarem
  int ClientWaiting = 0; // no. de clientes que estao esperando
  boolean Busy = false;  // indica se o barbeiro esta atendendo um cliente
  TicketQueue Waiting;


  void RequestClient() {
    Lock(Mutex);
      while(ClientWaiting == 0) {
        Wait(BarberBed, Mutex);
      }
      ClientWaiting--;
    Unlock(Mutex);
  }

  void ReleaseClient() {

  }

  boolean RequestBarber() {
    boolean IsFull;
    Lock(Mutex);
      IsFull = ClientWaiting == n;
      if (!IsFull) {
        ClientWaiting++;
        int MyTicket = Waiting.GeTicket();
        while((Busy) || (!Waiting.IsTheBest(MyTicket))) {
          Wait(ClientBed, Mutex);
        }
        Busy = true;
        Wakeup(BarberBed, Mutex);
        Waiting.Ok(MyTicket);
      }
    Unlock(Mutex);
    return IsFull;
  }

  void ReleaseBarber() {
    Lock(Mutex);
      Busy = false;
      Wakeup(ClientBed, Mutex);
    Unlock(Mutex);
  }
} // CBarberShop

class TicketQueue {
  int Ticket = 0;
  OrderedQueue q;

  int GetTicket() {
    q.Put(++Ticket);
    return Ticket;
  }
  boolean IsTheBest(int Ticket) {
    return Ticket == q.Top();
  }
  void Ok(int Ticket) {
    if (Ticket != q.Pop()) {
      ERRO!
    }
  }
} // TicketQueue



Osvaldo Carvalho - Postscript - Comentários?