- - - - CENAPAD-MGCO

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


Questão 4

#define n	20

/* variaveis globais */

TicketQueue waiting;
key mutex;
bed b\c{C} bB;
/* bC: cama dos clientes */
/* bB: cama do barbeiro */

int nC = 0, nB = 1;
/* nC: numero de clientes que estao sendo atendidos pelo barbeiro (0 ou 1) */
/* nB: numero de barbeiros que estao atendendo clientes (0 ou 1) */

int nbC = 0;
/* nbC: numero de clientes na cama */

void barber() {
     /* processo associado ao barbeiro */
     while (true) {
          requestClient();
          /* atendendo um cliente */
          releaseClient();
     }
}

void client() {
     /* processo associado a um cliente */
     requestBarber();
     /* sendo atendido pelo barbeiro */
     releaseBarber();
}

void requestClient() {
     lock(mutex);
          if (nbC == 0) {
               nB--;
               wait(bB, mutex);
          }
          nB++;
          wakeup(b\c{C} mutex);
     unlock(mutex);
}

void requestBarber() {
     lock(mutex);
          if (nbC < n) {
               int myTicket = waiting.getTicket();
               if (nbC == 0) {
                    wakeup(bB, mutex);
               }
               nbC++;
               while ((nC > 0) || (nB == 0) 
                 || (!waiting.isTheBest(myTicket))) {
                    wait(b\c{C} mutex);
               }
               nC++;
               nbC--;
               waiting.ok(myTicket);
          }
     unlock(mutex);
}

void releaseClient() {
     lock(mutex);
          nC--;
          wakeup(b\c{C} mutex);
     unlock(mutex);
}

void releaseBarber() { }



 

Osvaldo Carvalho - Postscript - Comentários?