-
-
-
CENAPAD-MGCO
A seguir: 5a Questão Acima: Elaine Gouvea Pimentel Anterior: 3a 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.