monitor bomboloni{ int b = 0; condition mario; condition piero; condition cliente; condition codaPiero; condition rosa; boolean deveFriggere = false; public void mario(){ if (!deveFriggere) wait(mario); if(b>0) deveFriggere = false; b=30; setTimer(60); signal(piero); if(!empty(rosa)){ signal(rosa); } } public void piero(){ if (b == 0){ setTimer(0); wait(piero); } if(empty(codaPiero)){ // Se non è ancora arrivato il cliente, Piero si mette in attesa.. wait(cliente); b--; } else{ // ..altrimenti lo serve e lo sveglia b--; signal(codaPiero); } } public void rosa(){ deveFriggere = true; if(!empty(mario)){ signal(mario); } else{ wait(rosa); } } public void cliente(){ if(empty(cliente)) wait(codaPiero); // Se Piero non è ancora arrivato si mette in attesa.. else signal(cliente) // ..altrimenti sveglia Piero } } bomboloni alpha; process piero(){ while(true){ alpha.piero(); } } process mario(){ while(true){ alpha.mario(); } } process rosa(){ while(true){ waitTimer() alpha.rosa(); } } process cliente(){ alpha.cliente(); }