monitor Barbearia {
// Campos (variáveis privadas) do monitor
...
// Operação chamada pelos clientes:
boolean cortaCabelo() { ... } // se a barbearia não estiver lotada, espera
// que o corte seja feito e retorna true
// se a barbearia estiver lotada, retorna false
// Operações chamadas pelos barbeiros:
void proximoCliente() { ... } // pega o próximo cliente (dentro desta chamada
// o barbeiro pode dormir esperando um cliente)
void corteTerminado() { ... } // o barbeiro acorda o cliente que está na sua
// cadeira e espera que ele saia da barbearia
// (tome cuidado para acordar o cliente certo)
}
Como a linguagem C não tem monitores, você implementará o monitor
Barbearia como um módulo C, que exporta as funções
cortaCabelo, proximoCliente e corteTerminado.
Dentro desse módulo você precisará de um mutex (para controlar os
acessos ao monitor) e de variáveis de condição. Tanto o mutex como as
variáveis de condição devem ser varíaveis privadas (static) do
módulo C que implementa o monitor.
Além deste módulo passivo, seu programa deverá ter pelo menos um módulo ativo, que implementará threads ``barbeiro'' e threads ``cliente''. A saída do seu programa deve indicar que barbeiro está atendendo a que cliente (ou seja, seu programa associa uma identificação a cada barbeiro e a cada cliente).