原子操作

gcc提供的__sync_系列的built-in函数【线程安全并且原子性的操作,操作的时候都不用加锁】:

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, ...) //{ tmp = *ptr; *ptr = ~tmp & value; return tmp; }
以上都是先返回*ptr的值,然后再将*ptr和value进行add/sub/or/and/xor/nand之后更新*ptr
以count = 4为例,调用__sync_fetch_and_add(&count,1)之后,返回值是4,count变成了5

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, ...) //{ *ptr = ~*ptr & value; return *ptr; }
以上都是先将*ptr和value进行add/sub/or/and/xor/nand之后更新*ptr,然后返回*ptr的值
以count = 4为例,调用__sync_add_and_fetch(&count,1)之后,count的值为5,返回值是5

/*可以用将这个12个函数用宏定义重新定义以下,使其更加方便的使用*/
#define ATOMIC_ADD_F(ptr, value) (( __typeof__ (*( ptr ))) __sync_add_and_fetch(( ptr ), ( value )))
#define ATOMIC_SUB_F(ptr, value) (( __typeof__ (*( ptr ))) __sync_sub_and_fetch(( ptr ), ( value )))
#define ATOMIC_OR_F(ptr, value)  (( __typeof__ (*( ptr ))) __sync_or_and_fetch(( ptr ), ( value )))
#define ATOMIC_AND_F(ptr, value) (( __typeof__ (*( ptr ))) __sync_and_and_fetch(( ptr ), ( value )))
#define ATOMIC_XOR_F(ptr, value) (( __typeof__ (*( ptr ))) __sync_xor_and_fetch(( ptr ), ( value )))

#define ATOMIC_F_ADD(ptr, value) (( __typeof__ (*( ptr ))) __sync_fetch_and_add(( ptr ), ( value )))
#define ATOMIC_F_SUB(ptr, value) (( __typeof__ (*( ptr ))) __sync_fetch_and_sub(( ptr ), ( value )))
#define ATOMIC_F_OR(ptr, value)  (( __typeof__ (*( ptr ))) __sync_fetch_and_or(( ptr ), ( value )))
#define ATOMIC_F_AND(ptr, value) (( __typeof__ (*( ptr ))) __sync_fetch_and_and(( ptr ), ( value )))
#define ATOMIC_F_XOR(ptr, value) (( __typeof__ (*( ptr ))) __sync_fetch_and_xor(( ptr ), ( value )))

__typeof__(var) 是gcc对C语言的一个扩展保留字,用于声明变量类型,var可以是数据类型(int, char*,结构体..),也可以是变量表达式
__typeof__(int*) x; ----------->int *x; //这两者声明的变量x都是一样的,下面的也都一样,意义等同

__typeof__(int) a;  ----------->int a;

__typeof__(*x) y;   ----------->int y;

__typeof__(&a) b:   ----------->int *b;

__typeof__(__typeof__(int *)[4]) ------------> int  *z[4]';


这两个函数提供原子的比较和交换,如果*ptr == oldval,就将newval写入*ptr,
第一个函数在相等并写入的情况下返回true.第二个函数返回操作之前的值
bool __sync_bool_compare_and_swap (type*ptr, type oldval, type newval, ...)
type __sync_val_compare_and_swap (type *ptr, type oldval,  type newval, ...)


type __sync_lock_test_and_set (type *ptr, type value, ...) //将*ptr设为value并返回*ptr操作之前的值

void __sync_lock_release (type *ptr, ...) //将*ptr置0


memory barrier【内存栅】的三种类型:
    acquire barrier : 不允许将barrier之后的内存读取指令移到barrier之前(linux kernel中的wmb())
    release barrier : 不允许将barrier之前的内存读取指令移到barrier之后 (linux kernel中的rmb())
    full barrier    : 以上两种barrier的合集(linux kernel中的mb())
 
__sync_synchronize (...) 发出一个full barrier 例:
 
    write1(somevalue1);
    write1(somevalue2);
    write1(somevalue3);
    __sync_synchronize();
    write1(somevalue4);
   
我们在最后一条语句之前加入一个memory barrier,强制cpu执行完前面的写入以后再执行后面的写内容

参考网址:http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值