enum
<atomic>

std::memory_order

enum memory_order;
内存顺序
用作执行*原子操作*的函数的参数,以指定其他线程上的其他操作如何同步。

它被定义为
1
2
3
4
5
6
7
8
typedef enum memory_order {
    memory_order_relaxed,   // relaxed
    memory_order_consume,   // consume
    memory_order_acquire,   // acquire
    memory_order_release,   // release
    memory_order_acq_rel,   // acquire/release
    memory_order_seq_cst    // sequentially consistent
} memory_order;

当多个线程访问一个*原子对象*时,所有*原子操作*都会在其中产生*明确定义的*行为:每个原子操作在其他任何原子操作可以访问它之前,都会在对象上完全执行。这保证了这些对象上没有数据竞争,而这正是*原子性*的定义特征。

但是,每个线程可能还会对原子对象本身以外的内存位置执行操作:而这些其他操作可能会在其他线程上产生*可见的副作用*。此类型的参数允许为操作指定一个*内存顺序*,该顺序决定了这些(可能的非原子)*可见副作用*如何在线程之间同步,使用*原子操作*作为同步点。

memory_order_relaxed
该操作被排序为在某个时间点原子地发生。
这是最宽松的*内存顺序*,对不同线程中的内存访问如何与原子操作排序没有提供任何保证。
memory_order_consume
[适用于*加载操作*]
该操作被排序为在*释放线程*中携带对*释放操作*依赖的所有内存访问(并在*加载线程*上具有可见的副作用)发生之后发生。
memory_order_acquire
[适用于*加载操作*]
该操作被排序为在*释放线程*中的所有内存访问(在*加载线程*上具有可见的副作用)发生之后发生。
memory_order_release
[适用于*存储操作*]
该操作被排序为发生在*consume*或*acquire*操作之前,作为其他可能在*加载线程*上具有可见副作用的内存访问的同步点。
memory_order_acq_rel
[适用于*加载/存储操作*]
该操作执行*获取*并执行*释放*(如上对memory_order_acquirememory_order_release的定义)。
memory_order_seq_cst
该操作以*顺序一致*的方式进行排序:所有使用此*内存顺序*的操作都将被排序为在可能对其他涉及线程产生可见副作用的所有内存访问发生之后发生。
这是最严格的*内存顺序*,可保证线程交互之间最少的意外副作用,尽管是非原子内存访问。
对于*consume*和*acquire*加载,*顺序一致*的存储操作被视为*释放*操作。