monitor bomboloni{ int b = 0 conditionition mario; condition piero; condition cliente; condition rosa; boolean deveFriggere = false; public void mario(){ if (!deveFriggere) wait(mario); // Si blocca in attesa che Rosa lo sblocchi per friggere if(b>0) // Se c'erano bomboloni scaduti, li butta deveFriggere = false; b=30; setTimer(60); signal(piero); // Sblocca Piero if(!empty(rosa)){ // Se Rosa prende il monitor prima di Mario resterà in attesa e.. signal(rosa); // ..verrà svegliata dopo che Mario ha fritto } } public void piero(){ if (b == 0){ // Quando finiscono i bomboloni.. setTimer(0); // ..sveglia Rosa wait(piero); // e si mette in attesa } wait(cliente); b--; } public void rosa(){ deveFriggere = true; // Se Rosa viene svegliata dobbiamo sicuramente friggere if(!empty(mario)){ // Se Mario è già arrivato, lo sveglia signal(mario); } else{ wait(rosa); // Altrimenti si mette in attesa che Mario arrivi } } } bomboloni alpha; process piero(){ while(true){ alpha.piero; } } process mario(){ while(true){ alpha.mario; } } process rosa(){ while(true){ waitTimer() alpha.rosa; } }