monitor Clock{ condition attesa; int tempo = ; int sveglia = 0; public void tick(){ // Funzione che incrementa il tempo e controlla se deve svegliare Rosa time++; if(tempo==sveglia){ signal(attesa); // Sveglia Rosa dalla waitTimer() } } public void waitTimer(){ wait(attesa); } public void setTimer(int min){ if(min == 0){ // Se Piero ha fatto una setTimer(0).. signal(attesa); // ..allora sveglio Rosa dalla waitTimer() } else{ sveglia = tempo + min; // Altrimenti setto normalmente la sveglia } } } monitor bomboloni{ int b = 0; condition mario; condition piero; condition cliente; condition rosa; boolean deveFriggere = false; public void mario(){ if (!deveFriggere) wait(mario); if(b>0) deveFriggere = false; b=30; clock.setTimer(60); signal(piero); if(!empty(rosa))signal(rosa); } public void piero(){ if (b == 0){ clock.setTimer(0); wait(piero); } wait(cliente); b--; } public void rosa(){ deveFriggere = true; if(!empty(mario)){ signal(mario); } else{ wait(rosa); } } } Bomboloni alpha; Clock clock; process piero(){ while(true){ alpha.piero(); } } process mario(){ while(true){ alpha.mario(); } } process rosa(){ while(true){ clock.waitTimer() alpha.rosa(); } } process Tempo{ while(true){ <"aspetta un secondcondo"> clock.tick(); } }