C++标准规定对原子操作的RMW(读-修改-写)操作将作用于原子变量的最新值。因此,即使使用memory_order_relaxed与这些操作一起在多个线程中执行,也不会影响RMW操作。
我认为只有在RMW操作时存在某种内存屏障或者内存栅的情况下,这种行为才是可能的,即使所指定的内存顺序是"relaxed"。 如果我的理解有误,请纠正我并解释一下如果没有使用这样的内存屏障,这些操作如何作用于最新值。如果我的理解是正确的,那么我可以进一步假设,在弱排序架构(如ARM或Alpha)上进行的RMW操作使用Acquire-Release或Seq-CST内存顺序不应该对性能产生额外影响。谢谢您的帮助。
我认为只有在RMW操作时存在某种内存屏障或者内存栅的情况下,这种行为才是可能的,即使所指定的内存顺序是"relaxed"。 如果我的理解有误,请纠正我并解释一下如果没有使用这样的内存屏障,这些操作如何作用于最新值。如果我的理解是正确的,那么我可以进一步假设,在弱排序架构(如ARM或Alpha)上进行的RMW操作使用Acquire-Release或Seq-CST内存顺序不应该对性能产生额外影响。谢谢您的帮助。
mfence
的说明:它保证在栅栏之前指定的所有加载和存储在栅栏之后执行任何加载或存储之前都是全局可观察的。 - LWimsey