当我将值写入字段时,关于新值何时保存在主存储器中,我能得到什么保证?例如,我怎么知道处理器没有将新值保存在它的私有缓存中,而是更新了主内存?
另一个例子:
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 被读取时,它不会从 CPU 缓存中获取旧值)。
是否可以在不使用锁或“volatile”关键字的情况下实现这一目标?(另外,假设我没有使用原始类型,而是使用 WORD 大小的结构[因此无法应用 volatile]。)