參考文章: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);