35

コンパイラ フェンスの概念は、メモリ モデル、バリア、順序付け、アトミックなどについて読んでいるときによく出てきますが、通常は、予想どおり、 CPU フェンスとも対になっているという文脈にあります。

ただし、ときどき、コンパイラにのみ適用されるフェンス構造について読むことがあります。この例は、 cppreference.comstd::atomic_signal_fenceで述べられている C++11 関数です。

std::atomic_signal_fence は std::atomic_thread_fence と同等ですが、メモリ順序付けのための CPU 命令は発行されません。コンパイラによる命令の並べ替えのみが、順序命令として抑制されます。

このトピックに関連する 5 つの質問があります。

  1. 名前std::atomic_signal_fenceが示すように、非同期割り込み(スレッドがシグナル ハンドラーを実行するためにカーネルによってプリエンプトされるなど) は、コンパイラのみのフェンスが役立つ唯一のケースですか?

  2. その有用性は、 などの強く順序付けられたものを含むすべてのアーキテクチャに適用されx86ますか?

  3. コンパイラのみのフェンスの有用性を実証するために、具体的な例を提供できますか?

  4. を使用する場合、使用と注文std::atomic_signal_fenceの違いはありますか? (違いはないと思います。)acq_relseq_cst

  5. この質問は最初の質問でカバーされるかもしれませんが、とにかくそれについて具体的に尋ねるのに十分興味があります:アクセスでフェンスを使用する必要はありますか? (もしそうなら、私はコンパイラーのみのフェンスが最適なツールになることthread_localを期待します。)atomic_signal_fence

ありがとうございました。

4

2 に答える 2

3

実際には、マルチコア コード (特に C11 以前のコード) でもコンパイラ フェンスが役立つ、移植性はないが便利な C プログラミング イディオムがいくつかあります。典型的な状況は、プログラムが通常は揮発性になる (共有変数へのアクセスであるため) いくつかのアクセスを行っているが、コンパイラーがアクセスを移動できるようにしたい場合です。ターゲット プラットフォームでアクセスがアトミックであることがわかっている場合 (およびその他の予防措置を講じている場合)、アクセスを不揮発性のままにしておくことができますが、コンパイラ バリアを使用してコードの移動を含めることができます。

ありがたいことに、このようなプログラミングのほとんどは、C11/C++11 の緩和されたアトミックで廃止されています。

于 2013-11-05T09:19:35.063 に答える