type __sync_fetch_and_add(type *ptr, type value);
type __sync_fetch_and_sub(type *ptr, type value);
type __sync_fetch_and_or(type *ptr, type value);
type __sync_fetch_and_and(type *ptr, type value);
type __sync_fetch_and_xor(type *ptr, type value);
type __sync_fetch_and_nand(type *ptr, type value);
type __sync_add_and_fetch(type *ptr, type value);
type __sync_sub_and_fetch(type *ptr, type value);
type __sync_or_and_fetch(type *ptr, type value);
type __sync_and_and_fetch(type *ptr, type value);
type __sync_xor_and_fetch(type *ptr, type value);
type __sync_nand_and_fetch(type *ptr, type value);__sync_fetch_and_add()与__sync_add_and_fetch()区别:__sync_fetch_and_add()先用再加,返回的是加之前的值 ---> rv = i++;__sync_add_and_fetch()先加在用,返回的是加之后的值 ---> rv =++i;
二 CAS
bool __sync_bool_compare_and_swap(type*ptr, type oldval, type newval,...)
type __sync_val_compare_and_swap(type *ptr, type oldval, type newval,...)
这两个函数提供原子的比较和交换,如果*ptr == oldval,就将newval写入*ptr,
第一个函数在相等并写入的情况下返回true.
第二个函数在返回操作之前的值。
三 内存屏蔽
__sync_synchronize(...)
gcc 版本低于4.4的有bug,慎用
四 赋值操作
还有两个函数:
type __sync_lock_test_and_set(type *ptr, type value,...)
将*ptr设为value并返回*ptr操作之前的值。
void__sync_lock_release(type *ptr,...)
将*ptr置0