- - - - CENAPAD-MGCO

A seguir: 5a Questão Acima: Cristiano Ligieri Pereira Anterior: 3a. Questao


4a. Questao

Bed bbed, /* barber bed   */ 
    cbed; /* customer bed */

int nc = 0,      /* number of customers waiting */
    busy = 0,    /* if the barber is busy */
    waiting = 0; /* number of customers waiting (auxiliar) */

Key mutex;


void barber() {
  while (TRUE) {
    lock(mutex);
      busy = 0;

      if (nc == 0)
        wait(bbed, mutex);

      nc--;

      if (waiting > 0) {
        waiting--;
        wakeup(cbed, mutex);
      }

      busy = 1;
    unlock(mutex);
    cut_hair();
  }
}

void customer() {
  lock(mutex);
  if (nc < NUMBER_OF_CHAIRS) {
    nc++;

    if (nc == 1 && busy == 0)
      wakeup(bbed, mutex);

    if (nc > 0 && busy == 1) {
      waiting++;
      wait(cbed, mutex);
    }

    unlock(mutex);
    get_hair_cut();
  }
  else {
    unlock(mutex);
  }
}



Osvaldo Carvalho - Postscript - Comentários?