Rob*_*ser 10 .net synchronization volatile test-and-set memory-fences
我知道.NET内存模型(在.NET Framework上;不是compact/micro/silverlight/mono/xna/what-have-you)保证对于某些类型(最值得注意的是原始整数和引用)操作保证是原子.
此外,我相信x86/x64测试和设置指令(和Interlocked.CompareExchange)实际上引用了全局内存位置,因此如果成功,另一个Interlocked.CompareExchange将看到新值.
最后,我相信volatile关键字是指令编译器尽快传播读写操作并不重新排序有关此变量的操作(对吗?).
这导致了一些问题:
Interlocked.Read没有int的重载,只有longs(2个WORD,因此通常不会原子读取).我一直认为.NET内存模型保证在读取整数/引用时会看到最新的值,但是使用处理器缓存,寄存器等等.我开始意识到这可能是不可能的.那么有没有办法强制重新获取变量?如果有两个全局整数变量x和y,则初始化为0,如果我写:
x = 1;
y = 2;
Run Code Online (Sandbox Code Playgroud)
那个NO线程将看到x = 0和y = 2(即写入将按顺序发生).如果它们不稳定,这会改变吗?
Interlocked.CompareExchange会看到更新后的值.x = 0和y = 2,并且使用volatile关键字不会改变它,因为CPU可以自由重新排序指令.你需要一个记忆障碍.摘要: