Когда я записываю значение в поле, какие гарантии я получаю относительно того, когда новое значение будет сохранено в основной памяти? Например, как узнать, что процессор не сохраняет новое значение в своем частном кеше, а обновляет основную память?
Другой пример:
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 еще не была сброшена?).
Какие примитивы (помимо блокировок) доступны для обеспечения сброса записи?
ИЗМЕНИТЬ
В примере кода, который я использовал, для записи и чтения используются разные методы. Разве Thread.MemoryBarrier не влияет только на перезапись инструкций, существующих в той же области?
Кроме того, предположим, что они не будут встроены JIT, как я могу убедиться, что значение, записанное в m_foo, будет храниться не в регистре, а в основной памяти? (или когда m_foo читается, он не получит старое значение из кеша процессора).
Можно ли добиться этого без использования блокировок или ключевого слова volatile? (также предположим, что я использую не примитивные типы, а структуры размером WORD [поэтому volatile нельзя применять].)
uint
и применитьvolatile
или любой другой метод, обсуждаемый в различных ответах. - person Abel   schedule 14.11.2009