编译器或处理器能否对以下指令重新排序,以便另一个线程看到 a == 0b == 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/

10-12 06:15