编译器或处理器能否对以下指令重新排序,以便另一个线程看到 a == 0
和 b == 1
?
假设 int a = 0, b = 0;
某处。
System.Threading.Interlocked.CompareExchange<int>(ref a, 1, 0);
System.Threading.Interlocked.CompareExchange<int>(ref b, 1, 0);
最佳答案
不可以。使用Interlock
将发出内存已满的信号。 “也就是说,任何变量在调用 Interlocked
方法之前写入,在调用 Interlocked
方法之前执行,任何变量在调用之后读取,在调用之后执行。” [1] 他们使用 volatile 读/写方法来防止 b = 1
出现在 a = 1
之前。
[1]:Jeffrey Richter:“CLR via C# - 第三版”第 V 部分线程,第 803 页
关于c# - .Net CompareExchange 重新排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25493465/