原子性操作函数

如果对一个变量进行自加自减操作,一般这样写:

int global_count = 0;
global_count ++;

如果是多线程操作,一般都需要加锁处理:

pthread_mutex_t count_lock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&count_lock);
global_count ++;
pthread_mutex_unlock(&count_lock);

其实,还有更好的方法,使用原子性操作函数:

__sync_fetch_and_add(&global_count, 1);

使用原子性操作函数的优势,不仅线程安全,而且也十分省时。

在 Linux 系统中,原子操作函数是一组用于确保多线程环境下变量操作安全的工具。以下是一个较为全面的原子操作函数列表,这些函数通常定义在头文件 `<asm/atomic.h>` 或 `<linux/atomic.h>` 中,并且广泛应用于内核开发中[^1]。 ### 原子操作函数列表 1. **读取和设置** - `atomic_read(v)`:读取原子变量的值。 - `atomic_set(v, i)`:设置原子变量的值为 `i`。 2. **基本算术操作** - `atomic_inc(v)`:将原子变量的值加 1。 - `atomic_dec(v)`:将原子变量的值减 1。 - `atomic_add(i, v)`:将原子变量的值加上 `i`。 - `atomic_sub(i, v)`:将原子变量的值减去 `i`。 3. **条件测试** - `atomic_inc_and_test(v)`:将原子变量的值加 1,并判断是否等于 0。如果等于 0,则返回 1。 - `atomic_dec_and_test(v)`:将原子变量的值减 1,并判断是否等于 0。如果等于 0,则返回 1。 - `atomic_add_negative(i, v)`:将原子变量的值加上 `i`,并判断结果是否为负数。如果是负数,则返回 1。 4. **位操作** - `atomic_and(i, v)`:对原子变量执行按位与操作。 - `atomic_or(i, v)`:对原子变量执行按位或操作。 - `atomic_xor(i, v)`:对原子变量执行按位异或操作。 5. **64 位扩展(适用于支持 64 位操作的架构)** - `atomic64_read(v)`:读取 64 位原子变量的值。 - `atomic64_set(v, i)`:设置 64 位原子变量的值为 `i`。 - `atomic64_inc(v)`:将 64 位原子变量的值加 1。 - `atomic64_dec(v)`:将 64 位原子变量的值减 1。 - `atomic64_add(i, v)`:将 64 位原子变量的值加上 `i`。 - `atomic64_sub(i, v)`:将 64 位原子变量的值减去 `i`。 - `atomic64_inc_and_test(v)`:将 64 位原子变量的值加 1,并判断是否等于 0。 - `atomic64_dec_and_test(v)`:将 64 位原子变量的值减 1,并判断是否等于 0。 6. **其他相关函数** - `atomic_xchg(v, new)`:交换原子变量的值与 `new` 的值。 - `atomic_cmpxchg(v, old, new)`:比较并交换原子变量的值。如果当前值等于 `old`,则将其替换为 `new`。 ### 示例代码 以下是一个简单的示例,展示如何使用原子操作函数: ```c #include <linux/atomic.h> atomic_t counter; void init_counter(void) { atomic_set(&counter, 0); // 初始化原子变量为 0 } void increment_counter(void) { atomic_inc(&counter); // 将原子变量的值加 1 } int get_counter_value(void) { return atomic_read(&counter); // 读取原子变量的值 } ``` ### 注意事项 硬件级别的原子操作依赖于 CPU 的支持。在单处理器系统中,某些指令本身可以视为原子操作,例如 `test_and_set` 和 `test_and_clear`。而在多处理器系统中,Linux 内核通过内存屏障等机制确保操作原子性[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Data-Mining

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值