什么是 C++11 标准中的消费操作?

Posted

技术标签:

【中文标题】什么是 C++11 标准中的消费操作?【英文标题】:What is a consume operation in the C++11 Standard? 【发布时间】:2013-02-22 14:33:31 【问题描述】:

我已经看到this question on acquire, release, consume, etc 存在,但是,没有答案真正定义“消费操作”实际上是什么。

在 1.10 第 5 段中指出:

对一个或多个内存位置的同步操作可以是消耗操作、获取操作、释放操作,也可以是获取和释放操作。

我想知道是否有人可以解释 C++11 标准第 1.10 节中使用的这是什么?

【问题讨论】:

我认为它在 Anthony Williams 的“C++ Concurrency in Action”中得到了很好的解释(但我忘记了)。 @KerrekSB 我想是时候买那本书了。 @TonyTheLion:是的,那本书解释得很好 我目前的猜测是它与数据依赖关系有关,例如同时加载指针并取消引用该指针...另请注意std::kill_dependency 【参考方案1】:

显然,经过一番搜索,“消费操作”是一种内存操作,其中从内存中读取的值在加载后用于多个操作,并创建数据依赖关系。

能够在不引入显式内存栅栏的情况下对操作进行排序,这是memory_order_consume 的明显(据我所知)目标。

使用memory_order_consume,编译器和CPU 需要 仅针对那些其地址或值是根据加载的值计算的后续加载和存储来排序有问题的加载。 source

本文后面会说:

/*Example code elided */

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

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

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

memory_order_consume:加载操作对受影响的内存位置执行消耗操作。

因此,据我了解,它是对内存加载进行排序,以便使用该加载的后续加载和存储确实是后续。换句话说,负载正在被消耗

【讨论】:

以上是关于什么是 C++11 标准中的消费操作?的主要内容,如果未能解决你的问题,请参考以下文章

C++11中多线程例子

C++11中多线程例子

综合运用: C++11 多线程下生产者消费者模型详解(转)

生产者-消费者”问题 用C语言编写

C语言库函数里有线性表基本操作函数吗?

请问如何用C语言实现“生产者与消费者问题”?(最好附上完整的C语言源代码)