- - - - CENAPAD-MGCO

A seguir: 4a Questão Acima: Sidney Batista Filho Anterior: 2a Questao


3a Questão

class CReaderWriter {
  Key Mutex; CBed Bed;
  TicketQueue Waiting;
  boolean ReadPriority = false;
  int nrwaiting = 0;

  void RequestWrite() {
    Lock(Mutex);
      int MyTicket = Waiting.GetTicket();
      while((nr>0) || (nw>0) || (!Waiting.IsTheBest(MyTicket)) ||
            (ReadPriority)) {
        Wait(Bed, Mutex);
      }
      nw++;
      Waiting.Ok(MyTicket);
    Unlock(Mutex);
  }

  void RequestRead() {
    Lock(Mutex);
      int MyTicket = Waiting.GetTicket();
      nrwaiting++;
      while ((nw>0) || (!Waiting.IsTheBest(MyTicket) && !ReadPriority)) {
        Wait(Bed, Mutex);
      }
      nrwaiting--;
      nr++;
      Waiting.Ok(MyTicket);
      Wakeup(Bed, Mutex);
    Unlock(Mutex);
  }

  void ReleaseWrite() {
    Lock(Mutex);
      nw--;
      ReadPriority = true;
      Wakeup(Bed, Mutex);
    Unlock(Mutex);
  }

  void ReleaseRead {
    Lock(Mutex);
      nr--;
      if (nrwaiting == 0)
        ReadPriority = false;
      Wakeup(Bed, Mutex);
    Unlock(Mutex);
  }
} // CReaderWriter

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) {
    q.Del(Ticket);
  }
} // TicketQueue

Observacoes:



Osvaldo Carvalho - Postscript - Comentários?