- - - - CENAPAD-MGCO

A seguir: 4a Questão Acima: Gabarito Anterior: 2a Questão


3a Questão

Resolva o problema dos leitores e escritores impondo a seguinte política: Sua solução tem problemas de starvation? Porque?

  Bed rBed, wBed;
  Key mutex;
  int nw = 0, nr = 0, nwwaiting = 0;
  Ticket readersMaxTicket = new Ticket(0);
  TicketQueue rQueue;

  void requestRead() {
    lock(mutex) {
      Ticket myTicket = rQueue.getTicket();
      while( (nw > 0) || (nwwaiting > 0 && 
                          myTicket.greaterThan(readersMaxTicket))) {
        wait(rBed, mutex);
      }
      nr++;
      rQueue.ok(myTicket);
    unlock(mutex);
  }

  void requestWrite() {
    lock(mutex);
      nwwaiting++;
      while ( (nw > 0) || (nr > 0) || 
              rQueue.minTicket().greaterThan(readersMaxTicket) ) {
        wait(wBed, mutex);
      }
      nwwaiting--;
      nw++;
    unlock(mutex);
  }

  void releaseRead() {
    lock(mutex);
      nr--;
      if(nr == 0) wakeup(wBed, mutex);
    unlock(mutex);
  }

  void releaseWrite() {
    lock(mutex);
      nw--;
      readersMaxTicket = rQueue.maxTicket;
      wakeup(rBed, mutex);
      wakeup(wBed, mutex);
    unlock(mutex);
  }

Esta solução não tem problemas de starvation para os leitores, que têm sua espera limitada a uma operação de escrita. Processos escritores podem entretanto ser vítimas de uma conspiração de outros escritores. A solução seria adotar tickets também para os escritores.



Osvaldo Carvalho - Postscript - Comentários?