Laboratório 6 - 18/4/2001

Na aula de 16/4, discutimos a técnica de passagem de bastão para gerar um determinado tipo de solução com semáforos a partir da especificação mais abstrata com await. No laboratório de hoje vocês vão usar essa técnica para desenvolver uma solução para o problema do jantar comunal.

O problema do jantar comunal envolve n canibais e m cozinheiros, cada cozinheiro dispondo de seu próprio caldeirão e vítima. Os canibais se servem a partir de uma única travessa, e depois vão comer em um canto qualquer. Os cozinheiros ficam continuamente preparando comida e enchendo essa travessa.

Os canibais são muito famintos e ficam eternamente se servindo e a seguir comendo a porção que pegaram. Os cozinheiros preenchem a travessa com porções de tamanho igual, e cada vez que um canibal se serve ele retira exatamente uma porção. Quando ele vai se servir e não tem comida na travessa ele fica esperando até que tenha.

Cada cozinheiro fica continuamente preparando comida. Em cada sessão de preparação ele cozinha P porções. Quando ele termina de preparar as P porções, ele se dirige à travessa. No entanto, ele só coloca a comida na travessa se a travessa estiver vazia. Se não estiver, o cozinheiro espera até que esteja.

Modele esse problema com threads canibais e threads cozinheiros, desenvolvendo a solução com a técnica de passagem de bastão (para quem já tinha visto esse problema antes, atenção para o fato de que o enunciado está apresentado de forma ligeiramente diferente!!!).

  1. Utilize uma variável porcoes, por exemplo, que conte o número de porções na travessa.
  2. Escreva expressões de await em função dessa variável.
  3. Escreva o comando SIGNAL em sua forma geral e depois faça as simplificações possíveis em cada caso.
  4. Deixe essas descrições de await e SIGNAL como comentários em seu programa.
  5. Faça com que m, n e P sejam parâmetros passados na linha de comando.
  6. Execute o programa para várias combinações de valores e verifique seu funcionamento.