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).