1

假设我有两个线程(T1、T2)共享的变量 A、B 和 C。
我有以下代码:

//T1  
//~~

A = 1;  
B = 1;  
C = 1;

InterlockedExchange(ref Foo, 1);

//T2  (executes AFTER T1 calls InterlockedExchange)  
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

InterlockedExchange(ref Bar, 1);

WriteLine(A);  
WriteLine(B);  
WriteLine(C);  

问题:
在 T1 和 T2 上调用 InterlockedExchange(隐式全围栏)是否意味着 T2 将“看到”T1 在围栏之前完成的写入?(A、B 和 C 变量),即使这些变量与FooBar不在同一缓存行上?

4

1 回答 1

0

是的。内存栅栏不是特定于变量的;它导致调用线程在围栏之前发出的所有加载和存储完成。

我可能错了,但我怀疑T2发出的围栏没有用——T1发出了商店;T2 发出的围栏将完成 T2 发出的任何加载/存储到该点为止。这不会导致 T1 发布的商店的可见性。

于 2010-05-28T10:46:20.520 回答