3

Herb Suttersの「原子兵器」に関する優れた講演を見た後、 Relaxed Atomicsの例について少し混乱しました。

私は、C++ メモリ モデル(SC-DRF = データ競合のない連続整合性)のアトミックが、ロード/読み取りで「取得」を行うことを理解しました。

std::memory_order_seq_cstロード[およびストア]のデフォルトはであるため、2つは同じであることを理解しています。

myatomic.load();                          // (1)
myatomic.load(std::memory_order_seq_cst); // (2)

これまでのところ、Relaxed Atomics は使用されていません (話を聞いた後は、Relaxed Atomics を使用することは決してありません。約束します。しかし、誰かに尋ねられたら、説明する必要があるかもしれません...)。

しかし、なぜ私が使用すると「リラックスした」セマンティクスなのですか

myatomic.load(std::memory_order_acquire);   // (3)

loadを取得していて解放していないのに、これが(1)and と異なるのはなぜ(2)ですか? ここで実際リラックスしているのは何ですか?

私が考えることができる唯一のことは、loadがacquireを意味すると誤解したことです。そして、それが真であり、デフォルトseq_cstが両方を意味する場合、それは完全なフェンスを意味するのではないでしょうか? その命令を上に渡すことも、下に移動することもできませんか? 私はその部分を誤解していたに違いありません。

[そしてストアリリースのために対称的に]。

4

3 に答える 3