次のように、32ビットの比較と交換のためにi686アーキテクチャでcmpxchg(比較と交換)を使用しています。
(編集者注: 元の 32 ビットの例にはバグがありましたが、問題はそれについてではありません。このバージョンは安全であり、おまけとして x86-64 でも正しくコンパイルされます。 また、インライン asm はそうではないことに注意してください。これには必要または推奨;または、 i486 および x86-64__atomic_compare_exchange_n
の古い__sync_bool_compare_and_swap
作業int32_t
int64_t
.しかし、この質問は、インライン asm でそれを行うことについてです.)
// note that this function doesn't return the updated oldVal
static int CAS(int *ptr, int oldVal, int newVal)
{
unsigned char ret;
__asm__ __volatile__ (
" lock\n"
" cmpxchgl %[newval], %[mem]\n"
" sete %0\n"
: "=q" (ret), [mem] "+m" (*ptr), "+a" (oldVal)
: [newval]"r" (newVal)
: "memory"); // barrier for compiler reordering around this
return ret; // ZF result, 1 on success else 0
}
64ビットの比較とスワップのx86_64アーキテクチャに相当するものは何ですか?
static int CAS(long *ptr, long oldVal, long newVal)
{
unsigned char ret;
// ?
return ret;
}