作为引用计数的计数器,操作如下:
#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,严格要求顺序。