На x86-64 вы можете атомарно обмениваться 2 указателями, только если они смежны в памяти и выровнены по 16 байтов с помощью инструкции cmpxchg16b
напрямую или с помощью libatomic_ops
:
AO_INLINE int
AO_compare_double_and_swap_double_full(volatile AO_double_t *addr,
AO_t old_val1, AO_t old_val2,
AO_t new_val1, AO_t new_val2)
{
char result;
__asm__ __volatile__("lock; cmpxchg16b %0; setz %1"
: "=m"(*addr), "=a"(result)
: "m"(*addr), "d" (old_val2), "a" (old_val1),
"c" (new_val2), "b" (new_val1)
: "memory");
return (int) result;
}
Если cmpxchg16b
недоступен, вам нужно использовать мьютекс, чтобы сделать обмен 2 указателями атомарными.