为了使用 cas,gcc 提供了一些有用的函数,例如
__sync_bool_compare_and_swap
但我们也可以使用像 cmpxchg 这样的 asm 代码
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了gcc 4.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 实现的吗?
谢谢!