Когда я записываю значение в поле, какие гарантии я получаю относительно того, когда новое значение будет сохранено в основной памяти? Например, как мне узнать, что процессор не сохраняет новое значение в своем частном кэше, а обновляет основную память?
Другой пример:
int m_foo;
void Read() // executed by thread X (on processor #0)
{
Console.Write(m_foo);
}
void Write() // executed by thread Y (on processor #1)
{
m_foo = 1;
}
Есть ли вероятность, что после завершения Write () какой-то другой поток выполнит Read () , но на самом деле увидит "0" в качестве текущего значения? (поскольку, возможно, предыдущая запись в m_foo еще не была очищена?).
Какие примитивы (кроме блокировок) доступны для обеспечения сброса записей?
EDIT
В примере кода, который я использовал, запись и чтение размещаются по-разному. Разве Thread.MemoryBarrier не влияет только на запись инструкций, которые существуют в той же области видимости?
Кроме того, давайте предположим, что они не будут встроены JIT, как я могу убедиться, что значение, записанное в m_foo, будет сохранено не в регистре, а в основной памяти? (или когда читается m_foo, он не получит старое значение из кэша ЦП).
Возможно ли достичь этого без использования блокировок или ключевого слова 'volatile'? (также, допустим, я не использую примитивные типы, но структуры размером с WORD [поэтому изменчивость не может быть применена] .)