vs的atomic和linux的stdatomic.h的原子操作的基本用法

作为引用计数的计数器,操作如下:

#include <atomic>
#include <iostream>

using namespace std;
int main()
{
	atomic_uint refcount;
	atomic_init(&refcount, 1);//初始化为1
	int cur = atomic_load(&refcount);
	cout << "cur is" << cur << endl;

	atomic_fetch_add_explicit(&refcount, 1, memory_order_relaxed);//加一
	cur = atomic_load(&refcount);
	cout << "cur is" << cur << endl;

	atomic_fetch_add_explicit(&refcount, -1, memory_order_relaxed);//减一
	cur = atomic_load(&refcount);
	cout << "cur is" << cur << endl;

	if (atomic_fetch_add_explicit(&refcount, -1, memory_order_acq_rel) == 1) {//减一判断
		cur = atomic_load(&refcount);
		cout << "in if cur is" << cur << endl;
	}

	cur = atomic_load(&refcount);
	cout << "cur is" << cur << endl;
	return 0;
}

其中,多线程执行的内存执行顺序如下面解释:

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;

可见,我赋值的时候,用的是relaxed不保证顺序;而判断的时候,用的是acq_rel,严格要求顺序。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值