我已经看到这个关于获取、释放、消费等的问题存在,但是,没有答案真正定义“消费操作”实际上是什么。
在 1.10 第 5 段中,它指出:
一个或多个内存位置上的同步操作是消耗操作、获取操作、释放操作或获取和释放操作。
我想知道是否有人可以解释 C++11 标准第 1.10 节中使用的这是什么?
我已经看到这个关于获取、释放、消费等的问题存在,但是,没有答案真正定义“消费操作”实际上是什么。
在 1.10 第 5 段中,它指出:
一个或多个内存位置上的同步操作是消耗操作、获取操作、释放操作或获取和释放操作。
我想知道是否有人可以解释 C++11 标准第 1.10 节中使用的这是什么?
显然,经过一番搜索,“消费操作”是一种内存操作,其中在多次操作中加载后使用从内存中读取的值,并创建数据依赖关系。
能够在不引入显式内存围栏的情况下对操作进行排序,是memory_order_consume
.
使用
memory_order_consume
,编译器和 CPU需要仅针对那些其地址或值是根据加载的值计算得出的后续加载和存储来对有问题的加载进行排序。 来源
在本文后面它说:
/*Example code elided */
关键点是
atomic_load_explicit()
usingmemory_order_consume
保证后续访问将看到由 执行的任何初始化insert_foo()
,即使它们同时执行,并且没有显式内存栅栏指令的开销。相反,memory_order_acquire
在弱排序系统上需要显式内存屏障,并且会过度约束所有系统上的编译器优化。
C++11 标准草案 n3485 定义memory_order_consume
为:
29.3 顺序和一致性 [atomics.order]
memory_order_consume:加载操作对受影响的内存位置执行消耗操作。
因此,据我了解,它是对内存加载进行排序,以便使用该加载的后续加载和存储确实是后续的。换句话说,负载正在被消耗。