C++内存序
欢迎访问个人网络日志🌹🌹知行空间🌹🌹
内存序是为了在做原子操作时,控制多线程间内存可见性的一种机制,从而有助于避免数据争用并确保正确同步。
之所以要对原子操作的内存序做限制还是在于编译器编译时和cpu
运行指令时会对指令做重排优化。这可能会导致意外的结果。关于指令乱序可以参考乱序执行与内存屏障,C++11中的内存模型上篇 - 内存模型基础。
c++11
中引入的原子类型上的操作服从 6
种内存次序:
- memory_order_relaxed
- memory_order_consume
- memory_order_acquire
- memory_order_release
- memory_order_acq_rel
- memory_order_seq_cst
memory_order_seq_cst
是可选的最严格的内存次序,各种原子类型的所有操作都默认遵从该次序,除非我们特意为某项操作另行指定。
内存次序共有6
种,但它们只代表3
种模式:
- 先后一致次序,
memory_order_seq_cst
- 获取-释放次序,
memory_order_consume、memory_order_acquire、memory_order_release
和memory_order_acq_rel
- 宽松次序,
memory_order_relaxed
顺序一致性
顺序一致性是一种相对的内存序,它允许在原子操作之间插入任意数量的其他操作,只要这些操作遵循顺序一致性,那么原子操作的顺序就和它们在代码中的顺序一致。
顺序一致性Sequential Consistency
,简称SC
,所有处理器都只能看到一个单一的操作执行顺序,顺序一致性实际上是一种强一致性,可以想象成整个程序过程中由一个开关来选择执行的线程,这样才能同时保证顺序一致性。
#include <atomic>
#include <thread>
#include <assert.h>
std::atomic<bool> x,y;
std::atomic<int> z;
std::memory_order m = std::memory_order_seq_cst;
void write_x()
{
x.store(true, m);
}
void write_y()