为什么在ISO / IEC 14882:2011中定义了明显的“线程间发生”关系?

时间:2013-07-21 03:17:15

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

ISO / IEC 14882:2011(C ++ 11)中的

1.10.11定义了评估之间的“线程间发生”之间的关系,它与第1.10.12节中“之前发生”关系的唯一区别在于A发生在B之前,如果A在B之前被排序,但这对于B之前的线程发生是不够的。为什么“之前的线程发生”足够重要以保证单独的定义?

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

  

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

这是什么意思?我知道传递闭包是什么,我知道一个集合关闭某些操作意味着什么,但我从来没有听说过“过渡性关闭”,Google和上下文都让我失望。

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

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

如果“之前排序”单独称为“之前发生线程间”,则该属性不成立,因为第一次排除(序列以“依赖顺序排列之前”结尾,后跟“之前排序”)。

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