参考文章:https://blog.csdn.net/yikai2009/article/details/8650221
1. 原子操作:
原子操作指的是在执行过程中不会被别的代码所中断的操作.。分为 位 和 整型变量 两类原子操作。
typedef struct { volatile int counter; } atomic_t;
2. 原子操作函数 分为 整形原子操作 和 位原子操作
3. 整型原子操作:
void atomic_set(atomic_t *v, int i); //设置原子变量v的值为i
atomic_t v = ATOMIC_INIT(0); //定义原子变量v, 并初始化为0
atomic_read(atomic_t *v); //获得原子变量的值,返回原子变量的值
void atomic_add(int i, atomic_t *v); //原子变量+i
void atomic_sub(int i, atomic_t *v); //原子变量-i
void atomic_inc(atomic_t *v); //原子变量+1
void atomic_dec(atomic_t *v); //原子变量-1
对原子变量执行自增,自减和减操作后 ,测试其是否为0,为 0 则返回 true,否则返回 false :
int atomic_inc_and_test(atomic_t *v);
int atomic_dec_and_test(atomic_t *v);
int atomic_sub_and_test(int i, atomic_t *v);
对原子变量进行加/减,自增/自减操作,并返回新的值:
int atomic_add_return(int i, atomic_t *v);
int atomic_sub_return(int i, atomic_t *v);
int atomic_inc_return(atomic_t *v);
int atomic_sub_return(atomic_t *v);
int atomic_add_unless(atomic_t *v, int a, int u); ( v!=u ) ? v+a,返回非0值 : 0;
int atomic_inc_not_zero(atomic_t *v); ( v!=0 ) ? v+1,返回非0值 : 0;
atomic_dec_not_one() 这是一个宏,不等于1,返回非0值;等于1,返回0
4. 位原子操作:
void set_bit(nr, void *addr); //将addr地址的nr位 置为1
void clear_bit(nr, void *addr); //将addr地址的nr位 置为0
void change_bit(nr, void *addr); //对addr地址的nr位 反置
int test_bit(nr, void *addr); //返回addr地址的nr位
int test_and_set_bit(nr, void *addr); //将*addr 的第n位设置成1,并返回原来这一位的值
int test_and_clear_bit(nr, void *addr); //将*addr 的第n位设置成0,并返回原来这一位的值
int test_and_change_bit(nr, void *addr);