Implementar uma solução para um problema clássico de comunicação entre processos (Problema dos Barbeiros - Willian Stallings - Operating Systems: Internals and Design Principles) usando o Mecanismo de Monitores.
Com base na solução do Problema da Barbearia apresentada por Willian Stallings (Operating Systems: Internals and Design Principles) estenda a solução para "n" barbeiros trabalhando simultaneamente (ou seja, em vez de ter 03 barbeiro e 03 poltrona de corte de cabelo, a barbearia agora tem "n" barbeiros e "n" poltronas de corte de cabelo).
Considere também que a barbearia agora tem "m" assentos para os clientes que estão esperando que algum barbeiro os atenda. Quando um cliente chega à barbearia ele observa se está lotada ou não. Se a barbearia estiver lotada (se todos os "n" barbeiros estiverem atendendo clientes e se todos os "m" assentos estiverem ocupados), ele sai sem esperar que o cabelo seja cortado. Se a barbearia não estiver lotada, ele entra e espera pelo corte do seu cabelo.
Divida o 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: */ /* se a barbearia não estiver lotada, espera que o corte */ /* seja feito e retorna true. */ /* se a barbearia estiver lotada, retorna false. */ boolean cortaCabelo() { ... } /* Operações chamadas pelos barbeiros: */ /* pega o próximo cliente (dentro desta chamada o /* barbeiro pode dormir esperando um cliente). void proximoCliente() { ... } /* o barbeiro acorda o cliente que está na sua cadeira */ /* e espera que ele saia da barbearia */ /* (tome cuidado para acordar o cliente certo). */ void corteTerminado() { ... } }
Como a Linguagem C não suporta a construção de monitores, implemente 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 variáveis privadas (static) do módulo C que implementa o monitor.
Além deste módulo passivo, o programa deverá acomodar pelo menos um módulo ativo, que implementará threads "barbeiro" e threads "cliente". A saída do seu programa deve indicar qual barbeiro está atendendo qual cliente (ou seja, seu programa associa uma identificação a cada barbeiro e a cada cliente). Ver solução apresentada por José Gonçalves - UFES - Problema dos Barbeiros usando PThreads
Desenvolva o projeto usando o pacote LinuxThreads, que implementa o padrão pthreads (POSIX Threads) para versões Linux 2.x ou superiores. (The LinuxThreads Library)
Todas as funções POSIX Threads têm nome começando com "pthread_". Neste exercício você não precisará de todas as funções pthread_... Você usará funções básicas de gerenciamento de threads (pthread_create, por exemplo), mutexes (pthread_mutex_...) e variáveis de condição (pthread_cond_...) Não é permitido o uso de outras bibliotecas de suporte à programação multithread (bibliotecas de semáforos, por exemplo).
Tutoriais de PThreads disponíveis na Internet: