C++ memory ordering

C++11 memory ordering

memory_order类型值说明
memory_order_acquire限制atomic.load()之后的load操作不能移到当前atomic.load()之前。
memory_order_release限制atomic.store()之前的store操作不能移到当前atomic.store()之后。
memory_order_acq_rel组合memory_order_acquire和memory_order_release限制。
memory_order_consume限制依赖atomic.load()的load操作不能移动到当前load()之前。
memory_order_seq_cst限制最严,要求顺序一致性(Sequentially Consistent)。
memory_order_relaxed限制最松,只须保证atomic操作的原子性,可任意reordering。

几点说明

1.C++11标准中增加了用于原子操作的类模板atomic。注意到atomic相关方法通常有一个memory_order类型的参数, 其缺省值为memory_order_seq_cst。
2.memory_order是一个enum类型,定义如下:

typedef enum memory_order {
   memory_order_relaxed,
   memory_order_consume,
   memory_order_acquire,
   memory_order_release,
   memory_order_acq_rel,
   memory_order_seq_cst
 } memory_order; 

3.注意到编译阶段和CPU执行时都可能对你的代码进行重排序,即reordering优化。
4.reordering可能导致内存访问顺序在多线程中(可见性)不一致。
5.memory_order用于限制reordering优化程度。
6.如何限制reordering优化?通常在代码中插入memory barrier相关指令即可实现。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值