-
-
-
CENAPAD-MGCO
A seguir: Classes Request e BarberQueue Acima: Fabio Tirelo Anterior: A solução proposta Starvation
Para esta questão, supomos os métodos void barbeiro() e void cliente(). Esses métodos possuem as primitivas de sincronização para garantir que somente um cliente por vez será atendido pelo barbeiro. Abaixo mostramos as implementações dos dois métodos:
BarberQueue waiting;
// Para garantir a ordem de atendimento igual a ordem de chegada
int num_esperando = 0; // Numero de clientes esperando
Key mutex;
Bed b;
boolean busy = false; // Se o barbeiro esta ocupado
void barbeiro()
{
while(true)
{
lock(mutex);
if (num_esperando > 0)
{
Request rq = waiting.nextRequest();
busy = true;
num_esperando--;
unlock(mutex);
/* Corta o cabelo do cliente */
lock(mutex);
wakeup(rq.bed, mutex);
busy = false;
}
else
wait(b, mutex);
unlock(mutex);
}
}
void cliente()
{
lock(mutex);
if (num_esperando == MAXIMO)
{
unlock(mutex);
return; /* desiste */
}
Request rq = waiting.newRequest();
num_esperando++;
if (busy || !waiting.isTheBest(rq))
wait(rq.bed, mutex);
else
{
wakeup(b, mutex); /* Acorda o barbeiro se ele estiver dormindo */
wait(rq.bed, mutex); /* Espera o barbeiro acabar o corte */
}
unlock(mutex);
}