原标题:C++ 的 6 种内存顺序,你都知道吗?
来源:盐焗咸鱼
https://blog.csdn.net/qq_33215865/article/details/88089927
原子操作的内存顺序
有六个内存顺序选项可应用于对原子类型的操作:
1. memory_order_relaxed
2. memory_order_consume
3. memory_order_acquire
4. memory_order_release
5. memory_order_acq_rel
6. memory_order_seq_cst。
除非你为特定的操作指定一个顺序选项,否则内存顺序选项对于所有原子类型默认都是memory_order_seq_cst。
6个内存顺序可以分为3类:
1. 自由顺序
(memory_order_relaxed)
2.获取-释放顺序
(memory_order_consume, memory_order_acquire, memory_order_release和memory_order_acq_rel)
3.排序一致顺序
(memory_order_seq_cst)
1、std::memory_order_relaxed “自由”内存顺序
在原子类型上的操作以自由序列执行,没有任何同步关系,仅对此操作要求原子性。例如,在某一线程中,先写入A,再写入B。但是在多核处理器中观测到的顺序可能是先写入B,再写入A。自由内存顺序对于不同变量可以自由重排序。
这是因为不同的CPU缓存和内部缓冲区,在同样的存储空间中可以存储不同的值。对于非一致排序操作,线程没有必要去保证一致性。
# include
# include
# include
std::atomic< bool> x,y;
std::atomic< int> z;
voidwrite_x_then_y
{
x.store( true, std::memory_order_relaxed);
y.store( true, std::memory_order_relaxed);
}
voidread_y_then_x
{
while(!y.load( std::memory_order_relaxed));
if(x.load( std::memory_order_relaxed))
++z;
}
intmain