Trabalho de Sistemas Operacionais - Problema dos Canibais
release 0.99.5
Renato Luiz Cunha
Luiz Rodrigo Castro
Helder Brito Nascimento
Uanderson Sigler Gomes
Guilherme Monteiro Garcia
Implementação em linguagem C de uma solução do problema dos canibais, um dos muitos problemas clássicos do comunicação entre processos, utilizando a biblioteca pthreads.
Suponha que um grupo de N canibais come jantares a partir de uma grande trabessa que comporta M porções. Quando alguém quer comer, ele (a) se serve da travessa, a menos que ela esteja vazia. Se a travessa está vazia, o canibal acorda o cozinheiro e espera até que o cozinheiro coloque mais M porções na travessa. Desenvolva o código para as ações dos canibais e do cozinheiro - rotinhas canibal, seserve (chamada por canibal), cozinheiro e encretravessa (chamada por cozinheiro). A solução deve evitar deadlock e deve acordar o cozinheiro apenas quando a travessa estiver vazia. Suponha um longo jantar, onde cada canibal continuamente se serve e come, sem se preocupar com as demais ações na vida de um canibal.
Nossa solução consiste no seguinte:
- Para a rotina seserve(), o canibal que está se servindo tenta dar um lock no mutex para poder decrementar o número de porções disponíveis na travessa. Caso a travessa esteja vazia, o canibal sinaliza a variável de condição vazio para o cozinheiro, que acordará e servirá mais uma rodada de porções. Se a travessa ficar vazia, os canibais vão dormir aguardando um sinal do cozinheiro usando a variável de condição cheio que, via broadcast, acordará TODOS os canibais.
- enchetravessa() segue raciocínio análogo e a mera análise/comparação do código de enchetravessa() com seserve() leva ao entendimento pleno de seu funcionamento. Deixamos este raciocínio como exercício para o leitor.
Descompacte o pacote dos canibais, entre no diretório criado e execute make.
Para rodar a solução, execute ./banquete dentro do diretório onde foi descompactada nossa solução. Instruções de execução aparecerão na tela. Boa sorte!
Gerado em Fri May 20 14:26:25 2005 para Antropofagia Eterna por
1.4.0