当main()退出时,分离线程会发生什么?
假设我正在启动a std::thread
然后detach()
它,所以线程继续执行,即使std::thread
它曾经代表它,超出范围。
进一步假设程序没有用于加入分离的线程1的可靠协议,因此分离的线程在main()
退出时仍然运行。
我在标准中找不到任何东西(更确切地说,在N3797 C ++ 14草案中),它描述了应该发生的事情,1.10和30.3都没有包含相关的措辞。
1另一个可能相当的问题是:“可以再次连接一个分离的线程”,因为无论你要发明什么协议加入,信号部分都必须在线程仍在运行时完成,并且OS调度程序可能决定在执行信令之后让线程休眠一小时,接收端无法可靠地检测到线程实际完成。
如果运行main()
脱离线程的运行是未定义的行为,那么任何使用std::thread::detach()
都是未定义的行为,除非主线程永远不会退出2。
因此,运行main()
脱离线程的耗尽必须具有已定义的效果。问题是:在哪里(在C ++标准中,不是POSIX,而不是OS文档,......)是定义的那些效果。
2分离的线程无法连接(在某种意义上std::thread::join()
)。您可以等待分离线程的结果(例如,通过未来std::packaged_task
,或通过计数信号量或标志和条件变量),但这并不能保证线程已完成执行。事实上,除非你把信令部分进入线程的第一个自动对象的析构函数,也将在一般情况下,是运行的代码(析构函数)后的信号代码。如果操作系统安排主线程使用结果并在分离的线程完成运行所述析构函数之前退出,^ Wis定义会发生什么?
九州编程
慕田峪7331174
相关分类