【发布时间】:2009-11-14 13:12:41
【问题描述】:
当我将一个值写入一个字段时,我可以获得什么保证新值何时保存在主内存中?例如,我怎么知道处理器没有将新值保存在其私有缓存中,而是更新了主内存?
另一个例子:
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]。)
【问题讨论】:
-
如果您有 WORD 大小的结构,您可以将它们转换为
uint并且您可以应用volatile或各种答案中讨论的任何其他技术。
标签: c# multithreading lock-free memory-model memory-fences