- - - - CENAPAD-MGCO

A seguir: 4a Questão Acima: Elaine Gouvea Pimentel Anterior: 2a Questão


3a Questão

int nW = 0;       /* Numero de escritores */
int nR = 0;        /* Numero de leitores */
int nRw = 0;     /* Numero de leitores esperando */
int nWw = 0;    /* Numero de escritores esperando;

/* Criamos uma fila de espera para leitores e outra para escritores */
Queue waitingW;
Queue waitingR; 

/* Escritores s\'{o} podem entrar na fila de espera caso exista um escritor
escrevendo 
ou caso nao haja leitores ou escritores na fila; isso garante prioridade de
leitura 
para leitores que estao na fila */

void requestWrite(int myTicket){
   if nW > 0 || ((nRw = 0) && (nWw = 0)) {
      lock(mutex);
     int myTicketW = getTicketW();
     if nW > 0 {
        nWw++;
        }
     while (nW > 0) || (nR > 0) || (!isTheBestW(myTicketW)) || (nRw > 0){
          wait(b, mutex);
          }
     nW ++;
     okW(myTicketW);
     unlock(mutex);
     }
  } 
  
void releaseWrite(myTicket){
   lock(mutex);
   nW --;
   if nWw > 0{
       nWw--;
       }
   okW(myTicketW);
   wakeup (b, mutex);
   unlock(mutex);
   }

Leitores só podem entrar na fila de espera caso haja um escritor escrevendo ou nao existam leitores nem escritores na fila; isso garante que nao haja starvation nos writes, ou seja, a fila de leitores é sempre finita

void requestRead(){
   if (nW > 0) || ((nRw = 0) && (nWw > 0)){
      lock(mutex);
      int myTicketR = getTicketR();
      if (nW > 0){
         nRw ++;
         }
      while (nW > 0) || (!isTheBestR(myTicketR)) {
           wait(b, mutex);
           }
      nR ++;
      okR(myTicketR);
      wakeup(b, mutex);
      unlock(mutex);
      }
    }
    
void releaseRead(){
   lock(mutex);
   nR--;
   if nRw > 0 { 
       nR--;
       }
   wakeup(b, mutex);
   unlock(mutex);
   }

Os procedimentos getTicketW, getTicketR, okW, okR, isTheBestW e isTheBestR sao similares aos dados em sala de aula, e utilizam as filas waitingW e waitingR

A solução proposta não tem problemas de starvation uma vez que, assim que o primeiro write da fila de espera e é executado, todos os leitores que estão na fila de espera são obrigados a ler. Então todos os writes restantes também são obrigados a ser executados e a fila fica vazia. Então o processo se reinicia.



Osvaldo Carvalho - Postscript - Comentários?