prod_cons0.c produttore consumatore senza sincronizzazione. Potrebbe avere problemi.

prod_cons_KO.c produttore consumatore senza sincronizzazione. L'inserimento di un'attesa di durata casuale tra lettura e scrittura della variabile condivisa mostra che non c'e' mutua esclusione.

prod_cons1.c  produttore consumatore sincronizzato mediante semafori (semaphore.h)

prod_cons1_KO.c produttore consumatore sincronizzato mediante semafori con errore (inversione dei lock) e conseguente deadlock. Mostra come sia facile fare errori di programmazione quando si maneggiano i semafori.

prod_cons2.c  produttore consumatore che usa queue thread-safe (grazie a semafori)

prod_cons3.c produttore consumatore sincronizzato mediante semafori e condition di pthread. Praticamente  un monitor fatto con semafori. La differenza sta nel fatto che invece di mettere il lock del mutex all'inizio (come avviene nel monitor), qui si mette solo nel momento in cui serve.
