6

C++ 11 のアトミック性とメモリ順序の概念を完全に理解しているかどうかはわかりません (すべて間違っている可能性があります)。この単純なシングル スレッドの例を見てみましょう。

int main()
{
    std::atomic<int> a(0);
    std::atomic<int> b(0);
    a.store(16);
    b.store(10);

    return 0;
}

このシングル スレッド コードでは、a と b がアトミック型でない場合、コンパイラは、アセンブリ コードのように命令を並べ替えることができます。 'a' に 16 を割り当てます。したがって、原子変数である私にとっては、ソースコードで述べたように、「b移動命令」の前に「a移動命令」があることが保証されます。その後、実行ユニット、プリフェッチ命令、アウトオブオーダー ボックスを備えたプロセッサがあります。そして、このプロセッサは、アセンブリ コードでの命令の順序が何であれ、「a 命令」の前に「b 命令」を処理できます。

そして、私の理解では、メモリ順序付けモデルが登場する場所です。その瞬間から、デフォルトのモデルを順次整合させれば。これらの値 (10 と 16) をメイン メモリにフラッシュすると、ソース コードでストアした順序が尊重されることが保証されます。そのため、プロセッサは、更新 'a' のためにメイン メモリに 16 が格納されているレジスタまたはキャッシュのフラッシュ アウトを開始し、その後、'b' のためにメイン メモリ内の 10 をフラッシュします。

そのため、リラックスしたメモリ モデルを使用すると、その動作を理解できるようになります。最後の部分だけは保証されないので、メインメモリのフラッシュが完全に乱れる可能性があります。

読みにくい場合は申し訳ありませんが、私の英語はまだ下手です。しかし、あなたの時間をありがとう。

4

2 に答える 2