除了前面信号量、自旋锁等方法,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);
原子变量不能直接当作整形变量使用,应通过上面函数取出其值