- - - - CENAPAD-MGCO

A seguir: Classes Request e BarberQueue Acima: Fabio Tirelo Anterior: A solução proposta Starvation


Quarta questão

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);
}



 

Osvaldo Carvalho - Postscript - Comentários?