У меня есть вопрос о следующем примере кода (m_value не является 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? (компилятор предупреждает о передаче летучих элементов по ссылке, поэтому следует ли игнорировать предупреждение в таком случае?)
Обратите внимание. Я не ищу "лучшие способы сделать что-то", поэтому, пожалуйста, не публикуйте ответы, предлагающие полностью альтернативные способы делать вещи ( "вместо этого используйте блокировку" )..), этот вопрос исходит из чистого интереса.