C++ Atomic Types and Operations に関する C ++0x の提案から:
29.1 順序と一貫性 [atomics.order]
次のパラグラフを含む新しいサブ条項を追加します。
列挙
memory_order
は、[N2334 または採用された後継によって追加された新しいセクション] で定義されているように、詳細な通常の (非アトミック) メモリ同期順序を指定し、操作の順序付けを提供する場合があります。その列挙値とその意味は次のとおりです。
memory_order_relaxed
この操作はメモリを順序付けません。
memory_order_release
影響を受けるメモリ位置で解放操作を実行し、それが適用されるアトミック変数を通じて、通常のメモリ書き込みを他のスレッドから見えるようにします。
memory_order_acquire
影響を受けるメモリ位置で取得操作を実行し、それが適用されるアトミック変数を介して解放された他のスレッドでの通常のメモリ書き込みを、現在のスレッドから見えるようにします。
memory_order_acq_rel
この操作には、取得と解放の両方のセマンティクスがあります。
memory_order_seq_cst
この操作には、取得セマンティクスと解放セマンティクスの両方があり、さらに、操作の順番に一貫性があります。
提案の下:
bool A::compare_swap( C& expected, C desired, memory_order success, memory_order failure ) volatile
ここで、CAS のメモリ順序を指定できます。
私の理解では、「<code>memory_order_acq_rel」は操作に必要なメモリ ロケーションのみを同期し、他のメモリ ロケーションは同期されないままになる可能性があります (メモリ フェンスとして動作しません)。
さて、私の質問は、「<code>memory_order_acq_rel」を選択compare_swap
して整数などの整数型に適用する場合、これは通常、マルチコア Intel i7 などの最新のコンシューマ プロセッサのマシン コードにどのように変換されるのでしょうか? 他の一般的に使用されているアーキテクチャ (x64、SPARC、ppc、arm) はどうですか?
具体的には (gcc などの具体的なコンパイラを想定):
- 上記の操作で整数の位置を比較して交換する方法は?
- そのようなコードはどのような命令シーケンスを生成しますか?
- i7での操作はロックフリーですか?
- このような操作は、完全なキャッシュ コヒーレンス プロトコルを実行し、i7 のメモリ フェンスであるかのように、異なるプロセッサ コアのキャッシュを同期しますか? それとも、この操作に必要なメモリ位置を同期するだけですか?
- 前の質問に関連して -
acq_rel
i7 でセマンティクスを使用すると、パフォーマンス上の利点はありますか? 他のアーキテクチャはどうですか?
すべての答えをありがとう。