x86プロセッサでは、コンペアアンドスワップアトミック操作とロードリンク/ストア条件付き操作の違いがわかりません。後者は前者より安全ですか?最初のものが2番目のものよりも優れているというのは本当ですか?
2 に答える
アトミック プリミティブには、Compare-Exchange、Load-Linked/Store-Conditional、Compare-And-Swap の 3 つの一般的なスタイルがあります。
CompareExchange 操作は、メモリ位置をアトミックに読み取り、比較値と一致する場合は、指定された新しい値を格納します。読み取った値が比較値と一致しない場合、ストアは行われません。いずれの場合でも、操作は読み取られた元の値を報告します。
Compare-And-Swap 操作は、CompareExchange と似ていますが、読み取られた値は報告されず、読み取られた値が比較値と一致したかどうかだけが報告される点が異なります。CompareExchange を使用して、メモリから読み取った値が指定された比較値と一致したかどうかを報告させることで、Compare-And-Swap を実装できることに注意してください。
LL/SC の組み合わせにより、値がロードされてから何らかの外部の影響がターゲットに影響を与えた可能性があるかどうかに基づいてストア操作を条件付けることができます。特に、ストアが成功した場合、場所が外部コードによってまったく書き込まれていないことが保証されます。外部コードが新しい値を書き込んで元の値を書き直したとしても、条件付きコードが失敗することが保証されます。概念的には、「ABA」の問題がないため、LL/SC は他の方法よりも強力に見えるかもしれません。残念ながら、LL/SC セマンティクスでは、ストアが自然に失敗する可能性があり、ロードとストアの間のコードの複雑さが増すにつれて、自然に失敗する可能性が急速に高くなる可能性があります。
3 つのプリミティブのうち、Compare-And-Swap は最も強力ではありませんが、他の 2 つのいずれかを使用して実装できます。CompareAndSwap は、CompareExchange をエミュレートするという非常に優れた仕事を行うことができますが、そのようなエミュレーションがライブロックする可能性があるまれなケースがいくつかあります。CompareExchange も Compare-And-Swap も LL-SC ほど強力な保証を提供できませんが、LL/SC ループ内に確実に配置できるコードの量が限られているため、その保証の有用性が制限されます。