Intel x86 プロセッサで、特定のメモリ位置である値を別の値と比較し、比較が成功した場合はマルチスレッド/プロセッサの問題を気にせずにメモリをリセットすることはできますか? CMPXCHG という指示が表示されますが、これは機能しますか? または、比較して設定するユースケースに何かありますか?
1 に答える
CMPXCHG 命令は、暗黙のレジスタ (EAX) の値をデスティネーションと比較し、ゼロ フラグ (EFLAGS.ZF) を更新して、デスティネーションの値が EAX で指定された値と一致したかどうかを示します。この場合、ソース オペランドの値 (明示的なレジスタ) が宛先に格納されます。CMPXCHG は、宛先から読み取った値で EAX も更新します。
ウィキペディアは、メモリ位置のデータが指定された値と一致したかどうか、したがってメモリ位置が更新されたかどうかの true/false 表示を取得する場所compare-and-set
の変形として説明しています。compare-and-swap
代替手段は、メモリから読み取ったcompare-and-swap
内容を返し、指定された値と自分で比較できます。
http://en.wikipedia.org/wiki/Compare-and-set
...にリダイレクトします
http://en.wikipedia.org/wiki/Compare-and-swap
この意味で、CMPXCHG は acompare-and-set
と a の両方です。compare-and-swap.
接頭辞を使用して、LOCK
CMPXCHG がアトミックに実行されるようにする必要があります。つまり、CMPXCHG を実行するスレッドは、他のスレッドがアクセスする前にメモリ位置を読み取ってから書き込む必要があります。
メモリの場所をゼロに設定することresetting the memory if the compare succeeded
を意味する場合、ゼロはソースレジスタに必要な値です。
ポータブルな方法については、このSOの質問compare-and-swap
のリソースを参照してください
CMPXCHG命令では、デスティネーション オペランドをレジスタだけでなくメモリ ロケーションにすることもできます。8 バイトをテストするときは、CMPXCHG8B 命令を使用します。CMPXCHG8B 命令でプレフィックスを指定し、宛先としてレジスタを指定すると、Pentium プロセッサにバグが発生します。LOCK
詳細については、こちらを参照してください。