atomic头文件编译_原子操作atomic_fetch_add

本文介绍了C语言中的原子操作`atomic_fetch_add`,包括其定义、作用、参数以及`memory_order`的含义。通过示例展示了如何使用`atomic_fetch_add_explicit`进行原子递增操作,对比了非原子操作可能出现的不确定性问题。
摘要由CSDN通过智能技术生成

定义

在头文件中定义

C atomic_fetch_add(volatile A * obj,M arg);

C atomic_fetch_add_explicit(volatile A * obj,M arg,memory_order order);

作用

作用:原子替换(obj + arg -> obj), 并返回obj之前的值。

怎么理解呢?就像是i++,先返回i之后再加,只不过这里可以加arg,并且是原子操作的。我们知道i++并不是原子操作。

参数

obj和arg通过“作用”部分你应该已经知道是做什么的啦,我们主要讲一下memory_order order是什么。

第一个函数的order默认是memory_order_seq_cst;

第二个函数的order原则上可以为memory_order中的任意值,我们来看一下memory_order是什么吧~

memory_order

定义

enum memory_order {

memory_order_relaxed,

memory_order_consume,

memory_order_acquire,

memory_order_release,

memory_order_acq_rel,

memory_order_seq_cst

};

含义

typedef enum memory_order {

memory_order_relaxed, // 不对执行顺序做保证,只保证此操作是原子的

memory_order_acquire, // 本线程中,所有后续的读操作必须在本条原子操作完成后执行

memory_order_release, // 本线程中,所有之前的写操作完成后才能执行本条原子操作

memory_order_acq_rel, // 同时包含 memory_order_acquire 和 memory_order_release

memory_order_consume, // 本线程中,所有后续的有关本原子类型的操作,必须在本条原子操作完成之后执行

memory_order_seq_cst // 全部存取都按顺序执行

} memory_order;

实例

#include #include

#include

atomic_int acnt;int cnt;

int f(void* thr_data){

for(int n = 0; n < 1000; ++n) {

atomic_fetch_add_explicit(&acnt, 1, memory_order_relaxed); // atomic

++cnt; // undefined behavior, in practice some updates missed

}

return 0;

}

int main(void){

thrd_t thr[10];

for(int n = 0; n < 10; ++n)

thrd_create(&thr[n], f, NULL);

for(int n = 0; n < 10; ++n)

thrd_join(thr[n], NULL);

printf("The atomic counter is %u\n", acnt);

printf("The non-atomic counter is %u\n", cnt);}

输出可能如下

The atomic counter is 10000The non-atomic counter is 9511

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值