31

遺言書をロックするstd::mutexと、常にメモリ フェンスが取得されますか? それがあなたにフェンスを取得することを暗示しているのか、強制しているのかはわかりません.

アップデート:

RMF のコメントをフォローアップするこのリファレンスを見つけました。

マルチスレッド プログラミングとメモリの可視性

4

3 に答える 3

16

私が理解しているように、これは以下でカバーされています:

1.10マルチスレッド実行とデータ競合

パラ5:

ライブラリは、同期操作として特別に識別されるいくつかのアトミック操作(29節)およびミューテックスに対する操作(30節)を定義します。これらの操作は、あるスレッドの割り当てを別のスレッドから見えるようにする上で特別な役割を果たします。1つ以上のメモリ位置での同期操作は、消費操作、取得操作、解放操作、または取得操作と解放操作の両方です。関連付けられたメモリ位置のない同期操作はフェンスであり、取得フェンス、解放フェンス、または取得フェンスと解放フェンスの両方にすることができます。さらに、同期操作ではない緩和されたアトミック操作と、特別な特性を持つアトミックな読み取り-変更-書き込み操作があります。[注:たとえば、ミューテックスを取得する呼び出しは、ミューテックスを構成するロケーションで取得操作を実行します。同様に、同じミューテックスを解放する呼び出しは、それらの同じ場所で解放操作を実行します。非公式には、Aでリリース操作を実行すると、他のメモリ位置に対する前のサイドエフェクトが、後でAで消費または取得操作を実行する他のスレッドに表示されるようになります。「リラックスした」アトミック操作は、同期操作のように、同期操作ではありません。データ競合に貢献することはできません。—エンドノート] Aでリリース操作を実行すると、他のメモリ位置での前のサイドエフェクトが、後でAで消費または取得操作を実行する他のスレッドに表示されるようになります。「リラックス」アトミック操作は、同期操作と同様に、同期操作ではありません。データ競合に貢献します。—エンドノート] Aでリリース操作を実行すると、他のメモリ位置での前のサイドエフェクトが、後でAで消費または取得操作を実行する他のスレッドに表示されるようになります。「リラックス」アトミック操作は、同期操作と同様に、同期操作ではありません。データ競合に貢献します。—エンドノート]

于 2012-06-23T21:10:11.533 に答える
12

ミューテックスのロック解除は、ミューテックスのロックと同期します。コンパイラが実装のためにどのようなオプションを持っているかはわかりませんが、フェンスと同じ効果が得られます。

于 2012-06-23T21:02:56.327 に答える