O Jantar dos selvagens

(problema adaptado do livro Little Book of Semaphores, de A. Downey)

Uma tribo de selvagens está jantando ao redor de um grande caldeirão contendo N porções de missionário cozido. Quando um selvagem quer comer, ele se serve no caldeirão, a menos que ele esteja vazio. Nesse caso, o selvagem primeiro tem de acordar o cozinheiro e esperar que ele encha o caldeirão de volta, para então se servir novamente. Após encher o caldeirão, o cozinheiro volta a dormir.

O comportamento de cada thread “selvagem” é o seguinte:

while True:
  servir()
  comer()

A thread “cozinheiro” tem o seguinte comportamento:

while True:
  encher_caldeirao()
  dormir()

As restrições de sincronização são:

  • Selvagens não podem se servir ao mesmo tempo (mas podem comer ao mesmo tempo).
  • Selvagens não podem se servir se o caldeirão estiver vazio.
  • O cozinheiro só pode encher o caldeirão quando ele estiver vazio.

Desafio: completar o código dos selvagens e do cozinheiro para atender as restrições de sincronização.