私が知っているように、 std::memory_order 列挙型はメモリフェンスを提供しますが、各 std::memory_order 列挙型要素によって提供されるフェンスについて確認する必要があります。以下では、std::memory_order 列挙要素のそれぞれを理解しているので説明します。
- std::memory_order_relaxed - フェンスが提供されていません
- std::memory_order_acquire - LoadLoad_LoadStore
- std::memory_order_release - LoadStore_StoreStore
- std::memory_order_consume - 通常は memory_order_acquire に等しい
- std::memory_order_acq_rel - LoadLoadLoadStore_LoadStoreStoreStore ???
- std::memory_order_seq_cst - StoreLoad_StoreLoad ???
最初の 4 つの要素については、よくわかりません。しかし、最後の 2 つの要素については、何もわかりません。
それについて正確に知っている人はいますか?
また、std::atomic または std::atomic_flag を使用する場合、コンパイラがメモリ フェンスを配置する場所を知る必要がありますか?
私が理解しているように、アトミックでフェンスを使用することは、フェンスを適用して操作を実行することを意味します。私は正しいですか?例えば:
atomic.load(std::memory_order_acquire);
memory_order_acquire フェンスを適用し、データをアトミックにロードすることを意味しますか?