//proposta dal prof alla correzione: semaphore mutex(1); semaphore ok2go(0); int n = 0; void wait4(void) { mutex.P(); n ++; if( n >= 4 ) { n --; ok2go.V(); } else { mutex.V(); ok2go.P(); n --; if( n > 0 ) ok2go.V(); else mutex.V(); } } //mia proposta @LLibera semaphore mutex(1); semaphore s(0); int countProcess = 0; void wait4(void) { mutex.P(); countProcess++; if(countProcess < 4) { mutex.V(); -----------------------------------------------------//nota bene qui s.P(); } else { for(int i = 1; i < 4; i++) s.V() countProcess = 0; mutex.V(); } } //NOTA dal ricevimento: Questa soluzione NON usa correttamente il passaggio del testimone //supponi che il processo p1, p2, p3 'vadano a prendersi un caffè' nella riga denotata dal commento //nota bene qui, quindi non fanno ancora la s.P(); //il processo p4 prende la mutex, incrementa countProcess, manda s.V() 3 volte, resetta countProcess a 0 e rilascia la mutex //p5 che ora può prendere la mutex (anche se si fosse bloccato prima) non prende un caffè nella riga denotata dal commento //quindi LA FIFO NON E' PIU' RISPETTATA! //la soluzione non può essere corretta se non eliminando la for e cambiando il codice 'profondamente' (almeno nel corpo del ramo else), //questo pk se dopo s.P(); venisse fatto qualcosa di diverso dal uscita di funzione ci sarebbe anche RACE CONDITION.