1

2 つのスレッド (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 変数)、これらの変数はFooおよびBarと同じキャッシュラインに配置されていませんが?

4

1 に答える 1

0

はい。メモリ フェンスは変数固有ではありません。これにより、呼び出しスレッドによってフェンスの前に発行されたすべてのロードとストアが完了します。

私は間違っているかもしれませんが、T2 によって発行されたフェンスは役に立たないのではないかと思います。T1 がストアを発行しました。T2 によって発行されたフェンスは、その時点までに T2 によって発行されたすべてのロード/ストアを完了します。これにより、T1 によって発行されたストアが表示されることはありません。

于 2010-05-28T10:46:20.520 に答える