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
が両方を意味する場合、それは完全なフェンスを意味するのではないでしょうか? その命令を上に渡すことも、下に移動することもできませんか? 私はその部分を誤解していたに違いありません。
[そしてストアとリリースのために対称的に]。