next up previous
Next: Sobre a entrega Up: ep2 Previous: Seu arsenal

Organização do programa

Divida seu programa em (pelo menos) dois módulos. Um desses módulos deve implementar um monitor que encapsula todos os acessos à barbearia:

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



Francisco Reverbel
2001-04-24