2018.03.19 -原子操作和原子变量

原子操作

       原子操作指的是不可再分的指令操作,即在执行原子操作时不可能被打断,要么原子操作没有执行,要么已经执行完毕。

       原子操作的实现必须需要硬件的支持,操作系统仅仅是在硬件指令的基础之上进行一次封装。对于没有实现原子操作的硬件,则需要操作系统从软件算法层面进行支持。


linux下的实现

       linux下原子操作的数据结构是atomic_t,其定义放在<linux/types.h>下:

[cpp]  view plain  copy
  1. typedef struct {  
  2.     int counter;  
  3. }atomic_t;  

可以看出原子操作仅支持int整形变量,为了与正常的整形区分,采用atomic_t来定义这个原子操作。

       原子操作的接口都在Atomic.h中列出(64位版本则在Atomic64.h)。包括:

原子操作接口

说明

int atomic_read(const atomic_t *v)

获取atomic_t类型变量的值

void atomic_set(atomic_t *v, int i)

设置atomic_t类型变量的值

void atomic_add(int i, atomic_t *v)

增加i

void atomic_sub(int i, atomic_t *v)

减少i

bool atomic_sub_and_test(int i, atomic_t *v)

减少i,如果结果为0则返回true

void atomic_inc(atomic_t *v)

等价于 atomic_add(1, v)

void atomic_dec(atomic_t *v)

等价于 atomic_sub(1, v)

bool atomic_dec_and_test(atomic_t *v)

atomic_sub(1, v),如果结果为0则返回true

bool atomic_inc_and_test(atomic_t *v)

atomic_add(1, v),如果结果为0则返回true

bool atomic_add_negative(int i, atomic_t *v)

增加i,如果结果为负则返回true

int atomic_add_return(int i, atomic_t *v)

增加i并返回结果

int atomic_sub_return(int i, atomic_t *v)

减少i并返回结果

atomic_inc_return(v)

宏,增加1并返回结果

atomic_dec_return(v)

宏,减少1并返回结果

int atomic_fetch_add(int i, atomic_t *v)

增加i,并返回原来的结果

int atomic_fetch_sub(int i, atomic_t *v)

减少i,并返回原来的结果

int atomic_cmpxchg(atomic_t *v, int old, int new)

比较old与v中的值,若相等则将new付给v,返回v原来的值

intatomic_xchg(atomic_t *v, int new)

将new付给v,并返回v原来的值


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值