O Barbeiro Dorminhoco
Dorminhoco
• O problema é análogo a manter o barbeiro ocupado enquanto há clientes, e descansando quando não há nenhum (fazendo isso de uma maneira ordenada).
O barbeiro e seus clientes correspondem aos processos mencionados acima.
A barbearia tem:
• um barbeiro
• uma cadeira de barbeiro
• algumas cadeiras para os fregueses esperarem
Se o movimento estiver fraco (nenhum freguês), o barbeiro senta na sua cadeira e dorme;
Quando um freguês chega no salão vazio, ele tem que acordar o barbeiro;
Se outros fregueses chegam enquanto o barbeiro está ocupado, eles:
• Sentam na cadeira de espera
• Vão embora, se não houver cadeira vazia.
Quando o barbeiro termina o corte de um cliente, dá uma olhada nas cadeiras de espera, se houver clientes: • ele escolhe um e o atende.
• Caso contrário, volta a dormir até aparecerem novos clientes.
Para garantir que clientes não furem fila, que o barbeiro não durma para sempre, que os clientes em espera sejam atendidos e apenas um por vez, são usados semáforos.
Serão usados três semáforos:
• customers, que conta os clientes à espera de atendimento (exceto o cliente que está na cadeira de barbeiro, que não está esperando);
• barbers, o número de barbeiros (0 ou 1) que estão ociosos à espera de clientes
• mutex, que é usado para exclusão mútua.
Precisamos ainda de uma variável, waiting, que também conta os clientes à espera de atendimento. Precisamos ainda de uma variável, waiting, que também conta os clientes à espera de atendimento. • Waiting é essencialmente uma cópia de customers. A razão de se ter waiting é que não há uma maneira de ler o valor atual do semáforo. Nessa solução, um cliente que entra na barbearia deve contar o número de clientes à espera de atendimento. Se este for menor que o número de cadeiras, ele ficará; do contrário, ele sairá.