2018.03.19 -原子操作和原子变量

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dzw19911024/article/details/79607129

原子操作

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

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


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原来的值


猜你喜欢

转载自blog.csdn.net/dzw19911024/article/details/79607129
今日推荐