【问题标题】:Concurrent object destruction并发对象销毁
【发布时间】:2014-08-27 00:53:25
【问题描述】:

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

如果构造函数完成 或具有静态存储持续时间的对象的动态初始化是 在另一个之前排序,完成析构函数 第二个是在析构函数启动之前排序的 第一的。 [注意:这个定义允许并发销毁。——结束 注意]

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

【问题讨论】:

    标签: c++ destructor language-lawyer


    【解决方案1】:

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


    除了标准1中描述的限制之外,没有任何限制,线程执行初始化和销毁​​具有静态存储持续时间的对象。特别是,不同翻译单元中对象的初始化相对于彼此是不确定的顺序(参见 [basic.start.init]/2),如果程序启动线程,则 unsequenced。 p>

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

    ______________
    1)“除了所说的,什么也不说”——有点重言式,但值得一提

    【讨论】:

    • @dyp:您是说程序在每个 TU 的一个线程中运行所有全局初始化器,将它们全部加入然后调用main 是无效的?
    • 也就是说,除了第二个的完成和第一个的启动必须在同一个线程中之外,没有其他限制。
    • @DmitryFucintv:甚至没有——第二个必须发生在第一个之前。
    • @dyp:我相信 [basic.start.init]/2 说 A 没有在 B 之前排序,B 也没有在 A 之前排序。它们真的是 unsequenced .
    • @dyp:哦,对了,这只是未排序的如果程序启动了一个线程。是的,否则托管环境必须建立一个序列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 2013-03-21
    • 1970-01-01
    相关资源
    最近更新 更多