- - - - CENAPAD-MGCO

A seguir: 3a Questão Acima: Elaine Gouvea Pimentel Anterior: 1a Questão


2a Questão

char direcao;
key mutex; 
bed b;
int nL=0; int nO=0;
TicketQueue waiting;

/* Em primeiro lugar, separamos a requisi\c{c}\~ao de acesso de 
  acordo com a direcao do vehiculo: se vai para leste(L) ou oeste(O) */
  
void requestAccess (direcao){
   lock(mutex);
   int myTicket = getTicket();
   if direcao == L {
        requestAccessL;
        }
   else {
        requestAccessO;
        }
   }

void requestAccessL(){
   while nO > 0 || (!isTheBest(myTicket)){
        wait(b, mutex);
        }
   nL++;
   ok(myTicket);
   wakeup(b, mutex);
   unlock(mutex);
   }

void requestAccessO(){
   while nL > 0 || (!isTheBest(myTicket)){
        wait(b, mutex);
        }
   nO++;
   ok(myTicket);
   wakeup(b, mutex);
   unlock(mutex);
   }

void releaseAccess(direcao){
   lock(mutex);
   if direcao = L {
        nL--;
        }
   else {
        nO --;
        }
   wakeup(b, mutex);
   unlock(mutex);
   }

Os procedimentos getTicket, isTheBest e ok são como descritos nas notas de aula.


Osvaldo Carvalho - Postscript - Comentários?