取得、解放、消費などに関するこの質問が存在することを見てきましたが、「消費操作」が実際に何であるかを実際に定義する答えはありません。
1.10 パラグラフ 5 では、次のように述べています。
1 つ以上のメモリ ロケーションに対する同期操作は、消費操作、取得操作、解放操作、または取得操作と解放操作の両方のいずれかです。
C++11 標準のセクション 1.10 で使用されているため、誰かがこれが何であるかを説明できるかどうか疑問に思いましたか?
取得、解放、消費などに関するこの質問が存在することを見てきましたが、「消費操作」が実際に何であるかを実際に定義する答えはありません。
1.10 パラグラフ 5 では、次のように述べています。
1 つ以上のメモリ ロケーションに対する同期操作は、消費操作、取得操作、解放操作、または取得操作と解放操作の両方のいずれかです。
C++11 標準のセクション 1.10 で使用されているため、誰かがこれが何であるかを説明できるかどうか疑問に思いましたか?
どうやら、いくつかの検索の後、「消費操作」は、メモリから読み取られた値がいくつかの操作でロード後に使用され、データ依存関係を作成するメモリ操作です。
明示的なメモリフェンスを導入せずに操作を注文できることは、(私の理解から)明らかな目標ですmemory_order_consume
。
を使用
memory_order_consume
すると、コンパイラとCPUは、ロードされた値からアドレスまたは値が計算される後続のロードとストアに対してのみ、問題のロードを順序付ける 必要があります。ソース
このテキストの後半では、次のように述べています。
/*Example code elided */
重要な点は、
atomic_load_explicit()
を使用すると、後続のアクセスが、明示的なメモリフェンス命令のオーバーヘッドなしで、同時に実行されている場合でも、memory_order_consume
によって実行された初期化を確認できることを保証することです。insert_foo()
対照memory_order_acquire
的に、弱く順序付けられたシステムでは明示的なメモリバリアが必要になり、すべてのシステムでコンパイラの最適化が過剰に制限されます。
C++11標準ドラフトn3485は次のように定義しmemory_order_consume
ています。
29.3順序と一貫性[atomics.order]
memory_order_consume:ロード操作は、影響を受けるメモリ位置で消費操作を実行します。
したがって、私の理解では、後続のロードとそのロードを使用するストアが実際に後続になるように、メモリロードを注文することです。つまり、負荷が消費されています。