для использования cas, gcc предоставляет некоторые полезные функции, такие как
__sync_bool_compare_and_swap
, но мы также можем использовать asm-код, такой как cmpxchg
bool ret;
__asm__ __volatile__(
"lock cmpxchg16b %1;\n"
"sete %0;\n"
:"=m"(ret),"+m" (*(volatile pointer_t *) (addr))
:"a" (old_value.ptr), "d" (old_value.tag), "b" (new_value.ptr), "c" (new_value.tag));
return ret;
У меня есть grep исходный код gcc4.6.3, и обнаружил, что __sync_bool_compare_and_swap реализован с использованием
typedef int (__kernel_cmpxchg_t) (int oldval, int newval, int *ptr);
#define __kernel_cmpxchg (*(__kernel_cmpxchg_t *) 0xffff0fc0)
, похоже, что 0xffff0fc0 является адресом некоторых вспомогательных функций ядра
, но в gcc 4.1.2 таких кодов неткак __kernel_cmpxchg_t, и я не могу найти реализацию __sync_bool_compare_and_swap.
Так в чем же разница между __sync_bool_compare_and_swap и cmpxchg?
__sync_bool_compare_and_swap реализован cmpxchg?
и с помощью вспомогательной функции ядра __kernel_cmpxchg_t, это реализовано cmpxchg?
спасибо!