3

ISO/IEC 14882:2011 (C++ 11) 的 § 1.10.11 定义了评估之间的“线程间发生之前”关系,其与 § 1.10.12 中的“发生之前”关系的唯一区别是 A 发生在 B 之前,如果A 在 B 之前排序,但这对于 A 线程间发生在 B 之前是不够的。为什么“线程间发生在之前”重要到足以保证单独的定义?

§ 1.10.11 中的一个注释表明“线程间发生在之前”不允许评估其唯一关系是部分“之前排序”

允许“线程间发生之前”被传递关闭

这意味着什么?我知道什么是传递闭包,我知道集合在某些操作上被关闭意味着什么,但我从来没有听说过“传递闭包”,而且谷歌和上下文都让我失望了。

4

2 回答 2

7

“线程间发生之前”纯粹是为了说明而定义的。请注意“发生在之前”如何定义为“在之前排序或线程间发生之前”,并且“线程间发生之前”的概念不用于其他任何事情。“Sequenced before”描述发生在同一个线程上的评估,“线程间发生在之前”适用于发生在不同线程上的评估;“发生在之前”结合了两者。

于 2013-07-21T04:22:55.940 回答
2

“传递关闭”的注释仅仅意味着关系是传递的:如果 A 线程间发生在 B 之前,B 线程间发生在 C 之前,那么 A 线程间发生在 C 之前。

如果由于第一次排除(以“之前的依赖排序”结尾的序列,后跟“之前排序的”结尾的序列),仅“之前排序”就符合“线程间发生之前”的条件,则该属性不成立。

这也意味着“发生在之前”不是及物的;如果 A 发生在 B 之前,B 发生在 C 之前,则不一定 A 发生在 C 之前。

于 2016-08-15T22:34:53.590 回答