- - - - CENAPAD-MGCO

A seguir: TicketQueue Acima: Janaina Farnese Lacerda Anterior: Questão 1


Questão 2

#define LEFT	0
#define RIGHT	1

/* variaveis globais */

TicketQueue waiting;
key mutex;
bed b;
int nR = 0, nL = 0;
/* nR: numero de carros em cima da ponto indo para a direita */
/* nL: numero de carros em cima da ponto indo para a esquerda */

void car(int direction) {
     /* processo associado ao carro */
     switch(direction) {
          case LEFT: {
               requestLeft();
               /* passando na ponte indo para a esquerda */
               releaseLeft();
               break;
          }
          case RIGHT: {
               requestRight();
               /* passando na ponte indo para a direita */
               releaseRight();
               break;
          }
          default: ERRO!;
     }
}

void requestRight() {
     lock(mutex);
          int myTicket = waiting.getTicket();
          while((nL > 0) || (!waiting.isTheBest(myTicket))) {
               wait(b, mutex);
          }
          nR++;
          waiting.ok(myTicket);
          wakeup(b, mutex);
     unlock(mutex);
}

void requestLeft() {
     lock(mutex);
          int myTicket = waiting.getTicket();
          while((nR > 0) || (!waiting.isTheBest(myTicket))) {
               wait(b, mutex);
          }
          nL++;
          waiting.ok(myTicket);
          wakeup(b, mutex);
     unlock(mutex);
}

void releaseRight() {
     lock(mutex);
          nR--;
          wakeup(b, mutex);
     unlock(mutex);
}

void releaseLeft() {
     lock(mutex);
          nL--;
          wakeup(b, mutex);
     unlock(mutex);
}



 

Osvaldo Carvalho - Postscript - Comentários?