Uma tribo de N canibais come uma grande marmita comum que tem capacidade de M porções. Quando um canibal quer comer, ele mesmo se serve da marmita, a não ser que esteja vazia. Se a marmita está vazia, o canibal acorda o cozinheiro e espera que o cozinheiro encha a marmita. Quando o cozinheiro termina de encher a marmita, e antes de deixar comer outro canibal, ele come. Depois de alguma outra atividade, volta a querer comer. O cozinheiro, por sua vez, volta a dormir toda vez que termina de encher a marmita.
Abaixo há um código denominado MARMITA, com dois procedimentos, um para que coma, processo CANIBAL, e outro para encher a marmita, processo COZINHEIRO. A solução deve evitar interbloqueios e deve acordar o cozinheiro somente quando a marmita estiver vazia.
Acesso_Comida: semáforo utilizado para permitir acesso à
comida (Up: permite, Down: não permite);
Espero_Vazio: semáforo utilizado para controlar
enchimento da marmita (Up: cozinheiro enche, Down:
cozinheiro dorme);
N_Porcoes_Max := M;
N_Porcoes := N_Porcoes_Max;
CANIBAL:
loop
....
Down (Acesso_Comida);
N_Porcoes := N_Porcoes - 1;
if N_Porcoes = 0
then Up (Espero_Vazio);
else Up (Acesso_Comida);
end if;
Up (Acesso_Comida);
...
end loop;
COZINHEIRO:
loop
. . .
Down (Espero_Vazio);
Down (Acesso_Comida);
N_Porcoes := N_Porcoes_Max;
Up (Acesso_Comida);
. . .
end loop;
Com base nos dados apresentados acima, julgue o item que se seguem.
O processo CANIBAL está semanticamente correto com relação ao comando “Quando o cozinheiro termina de encher a marmita, e antes de deixar comer outro canibal, ele come”.