estoy leyendo el post de Joe Duffy sobre Volatile reads and writes, and timeliness, y estoy tratando de entender algo sobre el último ejemplo de código en el mensaje:¿Interlocked.CompareExchange utiliza una barrera de 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;
…
Cuando se ejecuta la segunda operación cmpxchg, ¿utiliza una barrera de memoria para asegurarse de que el valor de m_state es de hecho el último valor escrito en él? ¿O solo usará algún valor que ya esté almacenado en el caché del procesador? (suponiendo que m_state no está declarado como volátil).
Si entiendo correctamente, si CMPXCHG no va a utilizar una barrera de memoria, entonces el procedimiento de adquisición de bloqueo completo no será justo ya que es muy probable que el hilo que fue el primero en adquirir el bloqueo sea el que lo hará adquirir todos los siguientes cerraduras. ¿Lo entendí correctamente o me estoy perdiendo algo aquí?
Editar: La pregunta principal es en realidad si llamar a CompareExchange causará una barrera de memoria antes de intentar leer el valor de m_state. Entonces, si todos los subprocesos asignan 0 serán visibles cuando intenten llamar de nuevo a CompareExchange.
Vale la pena mencionar que proporciona FULL FENCE y no half fence. –