21

在 C++11 标准中,第 1.10/5 节提到但没有正式定义术语acquire operationrelease operationconsume operation. 然后在第 29 节继续使用这些术语来描述某些内存排序、原子操作和内存栅栏的操作。例如,关于“秩序和一致性”的 29.3/1 指出:

memory_order_releasememory_order_acq_relmemory_order_seq_cst:存储操作对受影响的内存位置执行释放操作[强调添加]。

这种类型的语言在第 29 节中重复出现,但让我有点困扰的是memory_order枚举的所有含义都基于操作类型,这些操作类型本身似乎没有被标准形式化,但必须具有一些普遍同意的含义作为定义有效。

换一种说法,如果我说“一个 bar 是一个翻转的 foo”,那么barfoo的具体含义是模棱两可的,因为这两个术语都没有正式定义。仅定义了它们的相对性质。

acquire operationC++11 标准或其他一些 C++11 标准委员会文件是否正式定义了,等究竟是什么release operation,或者这些只是普遍理解的术语?如果是后者,对于这些操作的含义,是否有一个很好的参考被认为是行业标准?我特别问,因为硬件内存一致性模型不是平等的,因此我认为必须有一些普遍同意的参考,允许那些实现编译器等的人正确地将这些操作的语义转换为本机汇编命令。

4

4 回答 4

6

在其中一个注释中给出了一个非正式的总结定义:

执行释放操作A会强制其他内存位置上的先前副作用对稍后执行消耗或获取操作的其他线程可见A

除此之外,获取和释放操作的行为在 1.10 中完全定义,特别是它们如何促成发生前的关系。除了行为之外的任何定义都是无用的。

于 2012-05-10T02:52:10.247 回答
3

在快速浏览标准后,我没有看到任何正式的获取/释放语义定义,所以我的猜测是它们被假定为普遍理解的术语。

毕竟,他们无法定义一切。

这不是一个明确的参考,但Raymond Chen 写过关于获取/释放语义的博客。他的帖子包含一个指向 Microsoft 对获取和释放语义的定义的链接,您可能会发现它很有用。

于 2012-05-10T02:30:25.777 回答
3

实际上,这些操作在第 1.10/5-12 节中定义。

release/acquirepair 对应于发生在关系之前;而与依赖排序的前release/consume关系配对。

于 2012-05-10T02:48:54.670 回答
0

我还认为获取/释放语义本身是相当确定的;尽管它们在历史上是更多特定于硬件的术语,而不是编程术语。

但是,我认为第 1.10 节第 5 和第 6 节似乎与我在其他语言标准以及 CPU 定义中阅读的所有获取/释放语义定义相匹配。

无论如何,C++11 的主要点之一是定义一个现代内存模型来支持并发和多线程代码。我很难相信他们没有做对:)

于 2012-05-10T02:38:30.270 回答