Sleeping Barber
Program
SleepingBarber;
Const NCHAIRS = 3;
Var waitingClientes : integer;
Clientes, Barbers, Mutex : Semáforo;
Procedure Barber;
BEGIN
Repeat
Down(Clientes); /*
Espera chegada de algum Cliente */
Down(Mutex); /* Região
Crítica para atualizar waitingClientes */
waitingClientes := waitingClientes - 1;
Up(Barbers); /* Acorda
Barbeiro Dorminhoco */
Up(Mutex);
CortarCabelo; /* Corta
cabelo de cliente *
Until false;
END;
Procedure Clientes;
BEGIN
Down(Mutex); /* Região
Crítica para atualizar waitingClientes */
if waitingClientes < NCHAIRS then
BEGIN
waitingClientes := waitingClientes + 1;
Up(Clientes);
/* Avisa chegada de um novo cliente */
Up(Mutex);
Down(Barbers);
/* Vai dormir se não existem Barbeiros livres */
EsperaCorteCabelo;
/* Fica na fila para cortar cabelo */
END
else
Up(Mutex);
END;
BEGIN
Barbers.valor := 0; Clientes.valor
:= 0;
Mutex.valor := 1;
waitingClientes := 0;
PARBEGIN
Clientes; Clientes;
Clientes;
Clientes;
Clientes; Clientes; Clientes;
Barber;
PAREND;
END.