原子操作是指保证指令以原子方式执行,不会中途被打断。
linux 提供一个atomic_t类型的原子变量。
类型的具体定义是
typedef struct {
int counter;
} atomic_t;
内核提供很多操作函数
#define ATOMIC_INIT(i) { (i) } 申明一个原子变量并初始化为i
#define atomic_read(v) READ_ONCE((v)->counter) 读取原子变量的值
#define atomic_set(v, i) WRITE_ONCE(((v)->counter), (i)) 设置原子变量为i
#define atomic_dec_return(v) atomic_sub_return(1, (v)) 原子的给v减一并返回最新v值
#define atomic_inc_return(v) atomic_add_return(1, (v)) 原子的给v增加一并返回最新v值
#define atomic_xchg(ptr, v) (xchg(&(ptr)->counter, (v))) 把new值赋值给原子变量v,并且返回v的旧的值
#define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), (old), (new)))比较old和v的值,如果相等,则把new的值付给v,返回v的旧值。
内存屏障
ARM结构有三条内存屏障指令
数据存储屏障
数据同步屏障
指令同步屏障