什么是C++ 11标准中的使用操作?

Ton*_*ion 15 c++ multithreading memory-model c++11 semantics

我已经看到这个关于获取,释放,消费等的问题存在,但是,没有答案真正定义了"消费操作"实际上是什么.

在1.10第5段中,它指出:

在一个或多个存储器位置上的同步操作是消费操作,获取操作,释放操作,或获取和释放操作两者.

我想知道是否有人可以解释这是什么,因为它在C++ 11标准的1.10部分中使用?

Ton*_*ion 9

显然,在一些搜索之后,"消费操作"是一种存储操作,其中在几次操作中加载之后使用从存储器读取的值,并创建数据依赖性.

能够在不引入显式内存屏障的情况下订购操作,是明显的(根据我的理解)目标memory_order_consume.

因此memory_order_consume,编译器和CPU 需要仅针对那些后续加载和存储来对有问题的加载进行排序,其地址或值是根据加载的值计算的. 资源

本文稍后会说:

/*Example code elided */
Run Code Online (Sandbox Code Playgroud)

关键点在于atomic_load_explicit()使用memory_order_consume保证后续访问将看到由insert_foo()它们执行的任何初始化,即使它们是并发执行的,并且没有显式内存栅栏指令的开销.相反,memory_order_acquire在弱有序系统上需要显式内存屏障,并且会在所有系统上过度约束编译器优化.

C++ 11标准草案n3485定义memory_order_consume为:

29.3顺序和一致性[atomics.order]

memory_order_consume:加载操作对受影响的内存位置执行使用操作.

因此,根据我的理解,它是命令内存加载,以便后续加载和使用该加载的存储确实是后续的.换句话说,正在消耗负载.