原子操作函式原型
阿新 • • 發佈:2018-12-30
原子操作僅執行一次,在執行過程中不會中斷也不會休眠;是最小的執行單元;鑑於原子操作這些特性,可以利用它來解決競態問題。
往後其他同步機制都是在原子操作的基礎上進行擴充套件的。
原子操作有整型原子操作、64位原子操作以及位原子操作。
1 整型原子操作(Atomic Integer Operations)
要使用原子操作,需要定義一個原子變數,然後使用核心提供的介面對其進行原子操作。
整型原子變數結構如下
- #include <linux/type.h>
- typedef struct {
- int
- } atomic_t;
整型原子變數操作介面,其實現方式與具體的架構有關。
- #include <asm/atomic.h>
- ATOMIC_INIT(int i) // 定義原子變數時,將其值賦為i
- int atomic_read(atomic_t *v) // 讀v的值
- void atomic_set(atomic_t *v, int i) // 設定v的值為i
- void atomic_add(int i, atomic *
- void atomic_sub(int i, atomic *v) // v的值減少i
- void atomic_inc(atomic *v) // v的值加1
- void atomic_dec(atomic *v) // v的值減1
- int atomic_sub_and_test(int i, atomic_t *v) // v的值減少i,且結果為0時返回true
- int atomic_add_negative(int i, atomic_t *v) // v的值增加i,且結果為負數時返回true
- int atomic_add_return(int i, atomic_t *v) // v的值增加i,且返回結果
- int atomic_sub_return(int i, atomic_t *v) // v的值減少i,且返回結果
- int atomic_inc_return(atomic_t *v) // v的值加1,且返回結果
- int atomic_dec_return(atomic_t *v) // v的值減1,且返回結果
- int atomic_dec_and_test(atomic_t *v) // v的值減1,且結果為0時返回true
- int atomic_inc_and_test(atomic_t *v) // v的值加1,且結果為0時返回true
2 64位原子操作 (64-Bit Atomic Operations)
64位原子變數結構
- typedef struct {
- u64 __aligned(8) counter;
- } atomic64_t;
3 位原子操作 (Atomic Bitwise Operations)
位原子操作介面
- #include <asm/bitops.h>
- void set_bit(int nr, void *addr) // 將addr第nr位置1
- void clear_bit(int nr, void *addr) // 將addr第nr位置0
- void change_bit(int nr, void *addr) // 將addr第nr位值取反
- int test_and_set_bit(int nr, void *addr) // 將addr第nr位置1,並將該位之前值返回
- int test_and_clear_bit(int nr, void *addr) // 將addr第nr位置0,並將該位之前值返回
- int test_and_change_bit(int nr, void *addr)// 將addr第nr位取反,並將該位之前值返回
- int test_bit(int nr, void *addr) // 將addr第nr位的值返回