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

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

#include 
#include 

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,严格要求顺序。

 

你可能感兴趣的:(c++)