我知道 .NET 内存模型(在 .NET Framework 上;不是 compact/micro/silverlight/mono/xna/what-have-you)保证对于某些类型(最显着的原始整数和引用)操作保证是原子。
此外,我相信 x86/x64 测试和设置指令 (and Interlocked.CompareExchange
) 实际上引用了全局内存位置,因此如果它成功,另一个Interlocked.CompareExchange
会看到新值。
最后,我相信该volatile
关键字是对编译器的指令,以尽快传播读取和写入,并且不对有关此变量的操作重新排序(对吗?)。
这导致了几个问题:
- 我上面的信念是正确的吗?
Interlocked.Read
没有 int 的重载,仅适用于 longs(这是 2 个 WORD,因此通常不会以原子方式读取)。我一直认为 .NET 内存模型保证在读取整数/引用时会看到最新的值,但是对于处理器缓存、寄存器等。我开始看到这可能是不可能的。那么有没有办法强制重新获取变量?- volatile 足以解决整数和引用的上述问题吗?
- 在 x86/x64 上,我可以假设...
如果有两个全局整数变量 x 和 y,如果我写的话,都初始化为 0:
x = 1;
y = 2;
该 NO 线程将看到 x = 0 和 y = 2(即写入将按顺序发生)。如果它们不稳定,这会改变吗?