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

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

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 методы? (компилятор предупреждает о передаче летучих веществ по ссылке, поэтому я должен игнорировать предупреждение в таком случае?)

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

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

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