假设我先启动一个std::thread
,然后启动detach()
它,那么即使std::thread
那个曾经代表它,但超出范围,线程仍继续执行。
进一步假定该程序不具有用于加入分离线程1的可靠协议,因此分离线程在main()
退出时仍然运行。
我无法在标准(更确切地说,在N3797 C ++ 14草案中)中找到任何内容,该标准描述了应该发生的情况,无论1.10还是30.3都没有相关的措辞。
1另一个可能等效的问题是:“是否可以再次连接一个分离的线程”,因为无论您想加入哪种协议,都必须在线程仍在运行时完成信令部分,并且OS调度程序可能决定在执行信令后立即使线程休眠一个小时,而接收端无法可靠地检测到线程实际上已完成。
如果main()
用分离的线程运行时耗尽是未定义的行为,则除非主线程永不退出2,否则对的任何使用std::thread::detach()
都是未定义的行为。
因此,main()
用分离的线程运行时用尽必须具有定义的效果。问题是:在哪里定义了这些效果(在C ++标准中,不是POSIX,不是OS docs,...)。
2分离的线程无法连接(在的意义上std::thread::join()
)。您可以等待来自分离线程的结果(例如,通过来自的Future std::packaged_task
或通过计数信号量或标志和条件变量),但这不能保证线程已完成执行。事实上,除非你把信令部分进入线程的第一个自动对象的析构函数,也将在一般情况下,是代码(析构函数),其运行后的信号代码。如果操作系统安排主线程使用结果并在分离的线程完成运行所述析构函数之前退出,那么将定义发生什么?
std::exit
或退出之前终止每个线程main
足以满足这些要求,但不是必须的。” (整个段落可能是相关的),另请参阅[support.start.term] / 8(返回std::exit
时称为main
)