请问C ++ 11个标准正式定义的获取,发布和消费业务?(Does the C++11 standa

2019-07-29 08:27发布

在C ++ 11标准,部分1.10 / 5提到的,但没有正式定义术语acquire operationrelease operation ,并且consume operation 。 它接着在第29条中使用这些术语来描述某些内存排序,原子操作和内存栅栏的行为。 例如,在“订单和一致性” 29.3 / 1规定:

memory_order_release,memory_order_acq_relmemory_order_seq_cst:存储操作执行释放操作 [添加强调]在受影响的存储器位置。

这种类型的语言重复整个第29条,但它困扰我一点,对于所有的含义memory_order枚举是基于本身似乎并没有被标准正式操作类型,但必须有一些共同商定的含义为它们是有效的定义。

把不同的方式,如果我说“酒吧是一个翻转富”, 酒吧foo的具体含义是模糊的,因为没有长期的正式定义。 只有它们的相对性质定义。

请问C ++的11个标准,或其他一些C ++ 11标准委员会文件正式定义究竟是什么的acquire operationrelease operation等的,或者是这些简单的通常理解的术语? 如果是后者,在那里被认为是对这些操作的意义的行业标准一个很好的参考? 我特意问,因为没有创建硬件内存一致性模型一致,因此我盘算必须有一些共同商定的基准,让那些执行编译器等,这些操作的语义正确转换为本地组装的命令。

Answer 1:

有一个在笔记中的一个给定的非正式总结定义:

上执行释放操作A上的其他存储器位置的力之前的副作用变得可见,以稍后执行消耗或在获取操作其他线程A

除此之外,获取和释放操作的行为1.10完全定义,特别是在如何推动之前发生关系。 从行为除了任意定义是无用的。



Answer 2:

我没有看到获取/释放语义的任何正式的定义通过标准快速浏览后,所以我的猜测是,他们被认为是通常理解的术语。

他们不能定义一切,毕竟。

这不是一个明确的参考,但雷蒙德陈在博客获取/释放的语义 。 他的职位包括一个链接,获取和释放语义微软的定义 ,您也可能会发现有用。



Answer 3:

事实上,这些操作在部分1.10 / 5-12定义。

release/acquire对对应于关系之前发生 ; 而release/consume对所述依赖关系排序前的关系。



Answer 4:

我也借此获取/释放的语义是它自己相当明确; 虽然他们更多的硬件方面的具体历史,而不是编程术语。

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

无论如何,的C ++ 11的要点之一是,以限定一个现代存储器模型支持并发和多线程的代码。 我很难相信他们没有得到它吧:)



文章来源: Does the C++11 standard formally define acquire, release, and consume operations?