- - - - CENAPAD-MGCO

A seguir: TicketQueue Acima: Janaina Farnese Lacerda Anterior: TicketQueue


Questão 3

/* variaveis globais */

TicketQueue waitingR, waitingW;
/* waitingR: TicketQueue dos leitores */
/* waitingW: TicketQueue dos escritores */

key mutex;

bed bR, bW;
/* bR: cama de leitores */
/* bW: cama de escritores */

int nR = 0, nW = 0, noR = 0;
/* nR: numero de leitores que estao lendo */
/* nW: numero de escritores que estao escrevendo */
/* noR: numero de leitores que obrigatoriamente devem conseguir ler */

int nbR = 0, nbW = 0;
/* nbR: numero de leitores na cama de leitores */
/* nbW: numero de escritores na cama de escritores */

void writer() {
     /* processo associado ao escritor */
     requestWrite();
     /* escrevendo */
     releaseWrite();
}

void reader() {
     /* processo associado ao leitor */
     requestRead();
     /* lendo */
     releaseRead();
}

void requestWrite() {
     lock(mutex);
          int myTicket = waitingW.getTicket();
          nbW++;
          while((noR > 0) || (nR > 0) || (nW > 0) || (!waitingW.isTheBest(myTicket))) {
               wait(bW, mutex);
          }
          nW++;
          nbW--;
          noR = nbR;
          waitingW.ok(myTicket);
     unlock(mutex);
}

void requestRead() {
     lock(mutex);
          int myTicket = waitingR.getTicket();
          nbR++;
          if (nW > 0) {
               noR++;
          }
          while(((nW > 0) || (noR == 0) || (!waitingR.isTheBest(myTicket))) &&
                ((nW > 0) || (noR != 0) || (!waitingR.isTheBest(myTicket)) || (nbW > 0))) {
               wait(bR, mutex);
          }
          nR++;
          nbR--;
          if (noR > 0) {
               noR--;
          }
          waitingR.ok(myTicket);
          wakeup(bR, mutex);
     unlock(mutex);
}

void releaseWrite() {
     lock(mutex);
          nW--;
          wakeup(bR, mutex);
          wakeup(bW, mutex);
     unlock(mutex);
}

void releaseRead() {
     lock(mutex);
          nR--;
          wakeup(bW, mutex);
          wakeup(bR, mutex);
     unlock(mutex);
}



 

Osvaldo Carvalho - Postscript - Comentários?