A un esame risolsi un problema simile in questo modo (c'erano xo molti produttori e molti consumatori):
1-usa un altro array di appoggio: questo array potrà assumere solo i valori <dato pronto> <dato assente> <in scrittura>, ogni elemento dell'array ha una corrispondenza 1-1 cn l'array vero e proprio.
2- quando un produttore/consumatore vuole accedere a una locazione dell'array controlla prima l'array di supporto alla ricerca di una cella adatta (nel caso di consumatore <dato pronto>), setta poi il valore della cella(consumatore: <dato letto>) e infine va a prendersi effettivamente il dato.
La risorsa critica su cui imporre il lock diventa quindi l'array di stato e, siccome devi solo verificare/settare un parametro, il lock ha una durata molto breve.
Questa soluzione funziona bn nell'ipotesi ke c siano molti thread e ke la lettura/scrittura prenda tempo (molto maggiore d quello x settare l'array di supporto).