Блокировка и барьеры памяти

У меня есть вопрос о следующем примере кода (m_value не является энергозависимым, и каждый поток работает на отдельном процессоре)

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

Использует лиInterlocked.Exchange в Foo () гарантирует, что при выполнении Bar () я увижу значение «1»? (даже если значение уже существует в строке регистра или кэша?) Или мне нужно установить барьер памяти перед чтением значенияm_value?

Кроме того (не имеет отношения к первоначальному вопросу), законно ли объявлять изменчивого члена и передавать его со ссылкой наInterlockedXX методы? (компилятор предупреждает о передаче летучих веществ по ссылке, поэтому я должен игнорировать предупреждение в таком случае?)

Пожалуйста, обратите вниманиеЯ не ищу "лучших способов сделать что-то", поэтому, пожалуйста, не публикуйте ответы, которые предлагают совершенно альтернативные способы сделать что-то ("вместо этого используйте блокировку" и т. Д.), Этот вопрос возникает из чистого интереса ..

Ответы на вопрос(7)

Ваш ответ на вопрос