1. Store操作,可选如下顺序:
memory_order_relaxed,
memory_order_release,
memory_order_seq_cst
2. Load操作,可选如下顺序:
memory_order_relaxed,
memory_order_consume,
memory_order_acquire,
memory_order_seq_cst。
3. Read-modify-write(读-改-写)操作,可选如下顺序:
memory_order_relaxed,
memory_order_consume,
memory_order_acquire,
memory_order_release,
memory_order_acq_rel,
memory_order_seq_cst。
顺序一致内存顺序/memory_order_seq_cst
定义规则:全部存取都按照顺序执行。
memory_order_seq_cst 表示该原子操作必须顺序一致的,这是C++11中所有atomic原子操作的默认值。这样来理解“顺序一致”:即代码在线程中运行的顺序与程序员看到的代码顺序一致。也就是说,用此值提示编译器“不要给我重排序指令,不要整什么指令乱序执行,就按照我代码的先后顺序执行机器指令”。
松散内存顺序/memory_order_relaxed
定义规则:不对执行顺序做任何保证。
表示该原子操作指令可以任由编译器重排或者由处理器乱序执行。就是说”想怎么乱就怎么乱吧,不管了,只要能提高指令执行效率“。
Release-acquire内存顺序
load()使用memory_order_acquire,store()使用memory_order_release。
memory_order__acquire
规则定义:本线程中,所有后续的读操作,必须在本条原子操作完成后执行。(本线程中,我先读,你们后读……)
memory_order_release
规则定义:本线程中,所有之前的写操作完成后,才能执行本原子操作。(在本线程中,你们先写,我最后写……)
Release-consume内存顺序
memory_order_consume
规则定义:本线程中,所有后续的有关本数据的操作,必须在本条原子操作完成之后执行。(本线程中,我只关心我自己,当我用memory_order_consume时,后面所有对我的读写操作都不能被提前执行……)
相比于memory_order__acquire,memory_order_consume进一步放松了依赖关系。大家发现没有,前面讲的几种内存顺序都是在操控/安排多个atomic数据之间的读写顺序,而memory_order_consume仅仅考虑对一个atomic数据的读写顺序。