Blokowane i bariery pamięci

Mam pytanie dotyczące następującego przykładu kodu (m_wartość nie jest ulotny, a każdy wątek działa na osobnym procesorze)

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

Czy używaInterlocked.Exchange w Foo () gwarantuje, że po uruchomieniu Bar () zobaczę wartość „1”? (nawet jeśli wartość już istnieje w linii rejestru lub pamięci podręcznej?) Czy muszę umieścić barierę pamięci przed odczytaniem wartościm_wartość?

Również (niezwiązane z pierwotnym pytaniem), czy legalne jest zgłoszenie niestabilnego członka i przekazanie go przez odniesienie doZablokowanyXX metody? (kompilator ostrzega przed przekazywaniem zmiennych przez odniesienie, więc powinienem zignorować ostrzeżenie w takim przypadku?)

Proszę zanotować, Nie szukam „lepszych sposobów na robienie rzeczy”, więc proszę nie publikuj odpowiedzi, które sugerują całkowicie alternatywne sposoby robienia rzeczy („zamiast tego użyj blokady” itd.), To pytanie pochodzi z czystego zainteresowania ..

questionAnswers(7)

yourAnswerToTheQuestion