L'impostazione
Consideriamo una variante del classico problema di programmazione multithread: il problema produttore / consumatore. Abbiamo un numero finito di risorse (per semplicità, lascia che ci sia solo una singola risorsa). Il thread del produttore crea continuamente nuove unità di risorse, finché il buffer delle risorse non è pieno (nel nostro caso, può produrre solo un'unità di risorsa prima del blocco). Il thread del consumatore recupera le risorse dal buffer ed esegue alcuni lavori con esse.
Il problema
Il trucco consiste nell'usare una specie di primitiva di sincronizzazione (o più primitive) per impedire che il buffer entri in uno stato incoerente a causa delle condizioni di gara, ecc.
La domanda
Per quanto ne so, il problema potrebbe essere risolto utilizzando uno dei seguenti elementi:
- Monitor
- un mutex e una variabile di condizione
- due semafori
- tre mutex
Potrei usare l'algoritmo della soluzione semaforo per risolvere il problema usando solo due mutex, ma poiché il thread è autorizzato a sbloccare i propri mutex, questo algoritmo non può essere applicato qui. Non sono stato in grado di inventarne un altro finora.
Quindi, la mia domanda è:
È possibile risolvere la variante descritta del problema produttore / consumatore usando solo una coppia di mutex, senza alcuna altra primitiva di sincronizzazione? Se non lo è, perché? Potresti fornire una dimostrazione formale?