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