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相关指令即可实现。