TYPE marmita: monitor VAR cantLugares,cantComensales:Integer; rellenar, esperarComida, colaComensales : condition; faltaComida : boolean; BEGIN Procedure ENTRY entrar() BEGIN if (cantComensales = cantLugares || faltaComida ) then colaComensales.wait; end if if (!hay_suficiente_comida()) then faltaComida = true; esperarComida.wait; end if cantComensales = cantComensales + 1; END Procedure ENTRY salir() BEGIN cantComensales = cantComensales - 1; if (!faltaComida) then colaComensales.signal; else if(cantComensales = 0) then rellenar.signal; end if end if END Procedure dormir_cocinero() BEGIN rellenar.wait; END Procedure ENTRY fin_rellenar() BEGIN rellenando = false; for i=1 to cantLugares do esperarComida.signal; end for END BEGIN cantLugares = 6; cantComensales = 0; faltaComida = FALSE; END END Procedure canibal() BEGIN While TRUE do ocio(); marmita.entrar; comer(); marmita.salir; end while END Procedure cocinero() BEGIN While TRUE do marmita.dormir_cocinero; rellenar(); marmita.fin_rellenar(); end while END /* Principal */ BEGIN COBEGIN cocinero(); canibal(); . . canibal(); COEND END