atomic_t

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()

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值