c語言中的原子操作


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM