【问题标题】:What is a consume operation in the C++11 Standard?什么是 C++11 标准中的消费操作?
【发布时间】: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

标签: c++ multithreading c++11 semantics memory-model


【解决方案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:加载操作对受影响的内存位置执行消耗操作。

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

【讨论】:

    猜你喜欢
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 2018-11-27
    • 1970-01-01
    相关资源
    最近更新 更多