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