除了前面信號量、自旋鎖等方法,LDD中還介紹了一寫免鎖算法,主要包括:
環形緩沖、原子變量、位操作、seqlock、RCU等。
- 原子變量
原子變量的操作通常會被編譯成一條指令。
可以對一個值原子的加減、賦值、測試等,
原子變量只有24位長度
#include <asm/atomic.h>
//初始化
atomic_t v = ATOMIC_INIT(0);
//讀取
int atomic_read(&v);
//加減
void atomic_add(int i, &v);
void atomic_sub(int i, &v);
void atomic_inc( &v);
void atomic_dec( &v);
//加減并測試,計算結束后為0則返回真
int atomic_inc_and_test( &v);
int atomic_dec_and_test( &v);
int atomic_sub_and_test(int i, &v);
int atomic_add_negative(int i, &v); //將i加到v,結果為負時返回真
//加減并返回計算后的值(轉為整形)
int atomic_add_return(int i, &v);
int atomic_sub_return(int i, &v);
int atomic_inc_return(&v);
int atomic_dec_return(&v);
原子變量不能直接當作整形變量使用,應通過上面函數取出其值