Sto leggendo il post di Joe Duffy su Volatile reads and writes, and timeliness, e sto cercando di capire qualcosa circa l'ultimo esempio di codice nel post:Interlocked.CompareExchange utilizza una barriera di memoria?
while (Interlocked.CompareExchange(ref m_state, 1, 0) != 0) ;
m_state = 0;
while (Interlocked.CompareExchange(ref m_state, 1, 0) != 0) ;
m_state = 0;
…
Quando viene eseguita la seconda operazione cmpxchg vuol usare una barriera di memoria per garantire che il valore di m_state sia effettivamente l'ultimo valore scritto su di esso? O userà solo qualche valore che è già memorizzato nella cache del processore? (supponendo che m_state non sia dichiarato come volatile).
Se ho capito bene, se CMPXCHG non usa una barriera di memoria, allora l'intera procedura di acquisizione del lucchetto non sarà corretta poiché è altamente probabile che il thread che è stato il primo ad acquisire il lucchetto, sarà quello che acquisire tutte le seguenti serrature. Ho capito bene o sto perdendo qualcosa qui?
Modifica: La domanda principale è in realtà se la chiamata a CompareExchange causerà una barriera di memoria prima di tentare di leggere il valore di m_state. Quindi se l'assegnazione di 0 sarà visibile a tutti i thread quando provano a chiamare di nuovo CompareExchange.
Vale la pena menzionare che fornisce FULL FENCE e non mezzo recinto. –