我知道 .NET 内存模型(在 .NET Framework 上;不紧凑/微型/silverlight/mono/xna/what-have-you)保证对于某些类型(最显着的原始整数和引用)操作保证是原子。
此外,我相信 x86/x64 测试和设置指令(和 Interlocked.CompareExchange
)实际上引用了全局内存位置,所以如果它成功了另一个 Interlocked.CompareExchange
会看到新的值(value)。
最后,相信volatile
关键字是编译器的指令,以尽快传播读写操作,并且不重新排序有关此变量的操作(对吗?)。
这导致了几个问题:
Interlocked.Read
没有 int 的重载,仅用于 long(这是 2 个 WORD,因此通常不会以原子方式读取)。我一直假设 .NET 内存模型保证在读取整数/引用时会看到最新的值,但是对于处理器缓存、寄存器等。我开始看到这可能是不可能的。那么有没有办法强制重新获取变量? 如果有两个全局整数变量 x 和 y,都初始化为 0,如果我写:
x = 1;
y = 2;
该 NO 线程将看到 x = 0 和 y = 2(即写入将按顺序发生)。如果它们是不稳定的,这会改变吗?
最佳答案
Interlocked.CompareExchange
将看到更新的值。 x = 0
和 y = 2
,并且使用 volatile 关键字不会改变这一点,因为 CPU 可以自由地重新排序指令。你需要一个内存屏障。 概括:
关于.NET 内存模型、 volatile 变量和测试设置 : what is guaranteed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2099711/