atomic_t 的定义与用途
atomic_t 是 Linux 内核中用于原子操作的数据类型,通常用于多线程或多核环境下的共享变量访问。其定义在头文件 <linux/types.h> 中:
typedef struct {
int counter;
} atomic_t;
atomic_t 的特性
- 原子性:所有操作(读、写、修改)均保证不可分割,避免竞争条件。
- 内存屏障:隐含内存屏障指令,确保操作顺序性。
- 平台无关:在不同架构下通过内联汇编或特定指令实现原子性。
常用操作函数
以下函数均通过内核头文件 <linux/atomic.h> 提供:
初始化
atomic_t v = ATOMIC_INIT(0); // 初始化为0
读写操作
int atomic_read(const atomic_t *v); // 读取值
void atomic_set(atomic_t *v, int i); // 设置值
算术操作
void atomic_add(int i, atomic_t *v); // 加法
void atomic_sub(int i, atomic_t *v); // 减法
void atomic_inc(atomic_t *v); // 自增1
void atomic_dec(atomic_t *v); // 自减1
条件操作
int atomic_inc_and_test(atomic_t *v); // 自增后测试是否为0
int atomic_dec_and_test(atomic_t *v); // 自减后测试是否为0
int atomic_add_negative(int i, atomic_t *v); // 加法后测试是否为负
交换操作
int atomic_xchg(atomic_t *v, int new); // 交换为新值并返回旧值
int atomic_cmpxchg(atomic_t *v, int old, int new); // 比较并交换
使用示例
atomic_t counter = ATOMIC_INIT(0);
atomic_inc(&counter); // 线程安全的递增
if (atomic_read(&counter) == 1) {
// 临界区操作
}
注意事项
- 仅限整型:
atomic_t通常用于 32 位整数,64 位系统需使用atomic64_t。 - 非万能:复杂场景需结合锁(如自旋锁)或更高级的同步机制。
- 性能开销:原子操作比普通操作慢,应避免过度使用。
64 位扩展
对于 64 位变量,Linux 提供了 atomic64_t,其接口与 atomic_t 类似,函数名以 atomic64_ 前缀标识,例如 atomic64_add()。
556

被折叠的 条评论
为什么被折叠?



