- - - - CENAPAD-MGCO

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


4a Questão

int nB = 0;      /* indica se a cadeira do barbeiro est\'{a} ocupada (nB=1) 
                    ou nao (nB=0) */
Queue waiting;

void cliente(){
   lock(mutex);
   int myTicket = getTicket();
   if myTicket == -1 {
        unlock(mutex);
        exit (0);
        }
   while nB > 0 || (!isTheBest(myTicket)){
        wait(b, mutex);
        }
   nB++;
   ok(myTicket);
   unlock(mutex);
   }
   
void barbeiro(){
   lock(mutex);
   if nB > 0 {
       nB --;
       wakeup(b, mutex);
       }
   unlock(mutex);
   }

int n;          /* Numero de cadeiras da sala de espera*/   
int count = 0;
int ticket = 0;

int getTicket(){
   if count < n {
       waiting.put(++ticket);
       count++;
       return ticket;
       }
   else {
       return -1;
       }
   }
   
boolean isTheBest (int ticket){
   if (top(waiting) != null){
       return ticket == top(waiting);
       }
   return true;
   }
   
void ok(int ticket){
   if (ticket == top(waiting)){
       pop();
       count--;
       }
   else {ERRO;}
   }

Todo cliente que chega à barbearia verifica se existe alguma cadeira vazia (count < n). Em caso afirmativo, ele verifica se a cadeira do barbeiro está vazia. Se estiver ele senta-se na cadeira. Se não, ele entra na fila de espera com o seu ticket, o que garante que ele será atendido em algum momento. O barbeiro, por sua vez, sempre verifica se a sua cadeira está cheia. Caso esteja, executa o corte de cabelo do cliente, liberando-o em seguida.



Osvaldo Carvalho - Postscript - Comentários?