Interlocked und Memory Barriers

Ich habe eine Frage zu folgendem Codebeispiel (m_value ist nicht flüchtig und jeder Thread läuft auf einem separaten Prozessor

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;
}

Funktioniert mitInterlocked.Exchange In Foo () wird garantiert, dass beim Ausführen von Bar () der Wert "1" angezeigt wird. (Auch wenn der Wert bereits in einem Register oder einer Cache-Zeile vorhanden ist?) Oder muss vor dem Lesen des Werts von eine Speichersperre gesetzt werdenm_value?

Auch (unabhängig von der ursprünglichen Frage) ist es legal, ein flüchtiges Mitglied zu deklarieren und es unter Bezugnahme auf weiterzugebenInterlockedXX Methoden? (Der Compiler warnt davor, flüchtige Elemente als Referenz weiterzugeben. Sollte ich die Warnung in einem solchen Fall ignorieren?)

Bitte beachten SieIch suche nicht nach "besseren Möglichkeiten, Dinge zu tun", also poste bitte keine Antworten, die völlig andere Möglichkeiten vorschlagen ("benutze stattdessen eine Sperre" usw.). Diese Frage kommt aus reinem Interesse.

Antworten auf die Frage(7)

Ihre Antwort auf die Frage