C++ 并发对象销毁

C++ 并发对象销毁,c++,destructor,language-lawyer,C++,Destructor,Language Lawyer,我对sec有误解。3.6.3/1 N3797。当我考虑初始化规则时,我遇到了复制初始化的概念 如果建造师完成了 或者使用静态存储持续时间对对象进行动态初始化 在另一个之前排序,完成 第二个是在函数的析构函数启动之前排序的 第一。[注:此定义允许同时销毁。-结束 注] 第二个和第一个的完成析构函数是否可能位于不同的线程中?注意:我编辑并更正了关于未排序初始化的语句(感谢@dyp)。如果您的程序没有启动任何线程,那么所有初始化都会以某种(可能不确定的)顺序进行 除了Standard1中描述的约束之

我对sec有误解。3.6.3/1 N3797。当我考虑初始化规则时,我遇到了复制初始化的概念

如果建造师完成了 或者使用静态存储持续时间对对象进行动态初始化 在另一个之前排序,完成 第二个是在函数的析构函数启动之前排序的 第一。[注:此定义允许同时销毁。-结束 注]


第二个和第一个的完成析构函数是否可能位于不同的线程中?

注意:我编辑并更正了关于未排序初始化的语句(感谢@dyp)。如果您的程序没有启动任何线程,那么所有初始化都会以某种(可能不确定的)顺序进行


除了Standard1中描述的约束之外,没有其他约束,线程在这些约束上执行初始化和销毁具有静态存储持续时间的对象。特别是,不同转换单元中对象的初始化彼此之间的顺序是不确定的(cf.[basic.start.init]/2),如果程序启动线程,则不确定顺序

因此,如果TU中的第一个函数调用发生在主线程以外的另一个线程中,则初始化可能同时发生在多个线程中。该标准所说的是,那些初始化已排序的对象(例如,同一TU中的对象)也会以确定的、兼容的顺序销毁



1) “除了所说的,什么也没说”-有点重复,但值得一提的是

@dyp:你是说程序在每个TU的一个线程中运行所有全局初始值设定项是无效的,将它们全部加入,然后调用
main
?也就是说,除了第二个线程的完成和第一个线程的启动必须在同一个线程中之外,没有其他限制。@DmitryFucintv:甚至没有-第二个线程必须在第一个线程之前发生。@dyp:我相信[basic.start.init]/2表示A和B都不是在B之前排序的,B也不是在A之前排序的。它们实际上是未排序的。@dyp:哦,对了,只有当程序启动线程时才是未排序的。对,否则托管环境必须建立一个序列。