2

ここから: https://stackoverflow.com/a/2485177/462608

共有データへのスレッドセーフなアクセスの場合
、読み取り/書き込みが実際に行われること(コンパイラーが代わりにレジスターに値を格納するだけでなく、メインメモリーの更新をかなり後になるまで延期すること)
が行われないという保証が必要です。一部のデータを読み取る準備ができているかどうかを示すフラグとして揮発性変数を使用するとします。私たちのコードでは、データを準備した後にフラグを設定するだけなので、すべて問題なく表示されます。しかし、フラグが最初に設定されるように命令が並べ替えられた場合はどうなるでしょうか。

  • コンパイラが値をレジスタに格納し、メイン メモリの更新を延期するのはどのような場合ですか? 【上記引用に関して】
  • 上記の引用が話している「再注文」とは何ですか? それはどのような場合に起こりますか?
4

2 に答える 2

2

Q:コンパイラが値をレジスタに格納し、メイン メモリの更新を延期するのはどのような場合ですか?

A: (これは広範で自由回答形式の質問であり、おそらく stackoverflow 形式にはあまり適していません。) 短い答えは、ソース言語 (タグごとの C++) のセマンティクスがそれを許可し、コンパイラがそれを有益。

Q:上記の引用が話している「再注文」とは何ですか?

A:コンパイラや CPU が、元のプログラム ソースを 1 対 1 で変換した順序とは異なる順序でロード命令とストア命令を発行すること。

Q:どのような場合に発生しますか?

A:コンパイラーにとっては、最初の質問の回答と同様に、元のプログラムのセマンティクスが許可し、コンパイラーが利益があると判断した場合はいつでも。CPU の場合も同様です。CPU は、アーキテクチャ メモリ モデルに応じて、通常、元の (シングル スレッド!) 結果が同一である限り、メモリ アクセスを並べ替えることができます。たとえば、コンパイラと CPU の両方ができるだけ早く負荷を上げようとします。これは、負荷のレイテンシがパフォーマンスにとって重要な場合が多いためです。

より厳密な順序を強制するために、たとえば同期プリミティブを実装するために、CPU はさまざまなアトミックおよび/またはフェンス命令を提供し、コンパイラは、コンパイラとソース言語に応じて、並べ替えを禁止する方法を提供する場合があります。

于 2012-05-28T08:29:30.430 に答える