std::memory_order

这是一个enum类型,在头文件<atomic>中定义。

1
2
3
4
5
6
7
8
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;

std::memory_order 指定内存访问,包括常规的非原子内存访问,如何围绕原子操作排序。在没有任何约束的多处理器系统上,多个线程同时读或写数个变量时,一个线程能观测到变量值更改的顺序不同于另一个线程写它们的顺序。实际上,更改的顺序甚至能在多个读取线程间相异。一些类似的效果还能在单处理器系统上出现,因为内存模型允许编译器进行变换。

库中所有原子操作的默认行为提供序列一致定序(见后述讨论)。该默认行为可能有损性能,不过可以给予库的原子操作额外的 std::memory_order 实参,以指定确切的约束,在原子性外,编译器和处理器还必须强制该操作。

可以用这个类型的变量来规定“内存访问顺序”。
假设现在有n个atomic变量,编号为1,2……n,并且有多个线程同时访问这些变量。
有些线程读取,有些线程写入,假设写入线程不断按编号顺序依次更新这些变量,
无法保证在读取线程中,观测到的变量更改也是按顺序的。(尤其在多处理器系统中)

因此可以在进行原子操作时传入一个memory_order变量,来规定应这些变量读取顺序。

个人理解

memory_order_relaxed 无限制

memory_order_acquire 确保先进行(标记为relax的操作)再进行这个操作

memory_order_consume ?

memory_order_seq_cst ?

memory_order_seq_cst ?

Author: LouisZ
Link: http://notes.louisz.top/2024/06/std-memory-order/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.