【发布时间】:2012-05-18 13:52:25
【问题描述】:
在 C++11 标准中,第 1.10/5 节提到但没有正式定义术语 acquire operation、release operation 和 consume operation。然后在第 29 节继续使用这些术语来描述某些内存排序、原子操作和内存栅栏的操作。例如,关于“秩序和一致性”的 29.3/1 指出:
memory_order_release、memory_order_acq_rel 和 memory_order_seq_cst:存储操作在受影响的内存位置。
这种类型的语言在第 29 节中重复出现,但让我有点困扰的是,memory_order 枚举的所有含义都基于操作类型,这些操作类型本身似乎没有被标准形式化,但必须有一些共同点商定的含义,使它们作为定义有效。
换一种说法,如果我说“一个 bar 是一个翻转的 foo”,那么 bar 和 foo 的具体含义是模棱两可的,因为这两个术语都没有正式定义。只定义了它们的相对性质。
C++11 标准或其他一些 C++11 标准委员会文件是否正式定义了 acquire operation、release operation 等究竟是什么,或者这些只是普遍理解的术语?如果是后者,对于这些操作的含义,是否有一个很好的参考被认为是行业标准?我特别问,因为硬件内存一致性模型不是平等创建的,因此我认为必须有一些普遍同意的参考,允许那些实现编译器等的人正确地将这些操作的语义转换为本机汇编命令。
【问题讨论】:
-
我同意 OP。该标准在逻辑上是否可解读是一个问题,但无论如何,该标准在这一特定点上异常令人困惑。
-
Jeff Preshing's blog post about release/acquire 以与 C++11 语义兼容的方式根据早/晚加载/存储所需的顺序来定义它们。我没有意识到 C++11 没有用这样的术语正式定义它们。