Interbloqueado y barreras de memoria

Tengo una pregunta sobre el siguiente ejemplo de código (m_value no es volátil, y cada hilo se ejecuta en un procesador separado)

void Foo() // executed by thread #1, BEFORE Bar() is executed
{
   Interlocked.Exchange(ref m_value, 1);
}

bool Bar() // executed by thread #2, AFTER Foo() is executed
{
   return m_value == 1;
}

Hace usoEnclavado. en Foo () garantiza que cuando se ejecuta Bar (), veré el valor "1"? (¿Incluso si el valor ya existe en un registro o en una línea de caché?) ¿O necesito colocar una barrera de memoria antes de leer el valor dem_value?

También (no relacionado con la pregunta original), ¿es legal declarar un miembro volátil y pasarlo por referencia aEntrelazadoXX métodos? (El compilador advierte sobre el paso de volátiles por referencia, así que, ¿debería ignorar la advertencia en tal caso?)

Tenga en cuenta, No estoy buscando "mejores formas de hacer las cosas", así que no publique respuestas que sugieran formas completamente alternativas de hacer las cosas ("use un candado en su lugar", etc.), esta pregunta surge por puro interés

Respuestas a la pregunta(7)

Su respuesta a la pregunta