原子操作
原子操作指的是不可再分的指令操作,即在执行原子操作时不可能被打断,要么原子操作没有执行,要么已经执行完毕。
原子操作的实现必须需要硬件的支持,操作系统仅仅是在硬件指令的基础之上进行一次封装。对于没有实现原子操作的硬件,则需要操作系统从软件算法层面进行支持。
linux下的实现
linux下原子操作的数据结构是atomic_t,其定义放在<linux/types.h>下:
- typedef struct {
- int counter;
- }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原来的值 |