我有一个类似的线程:
std::thread t{ [](){} };
所以新线程突然结束。如果我没有调用join
,那么操作系统可能会将上下文切换到这个" dead"线?或系统"注意到"这个线程没有活动,即使我从不打电话给join
,也从不切换到它?
答案 0 :(得分:1)
当你的线程完成时,它真的完成了。操作系统永远不会将上下文切换到它,因为无处可切换上下文。但是你的std :: thread对象仍然存在,你仍然可以在其上调用join
。并且它会表现正常:一旦线程完成,就会立即返回。
答案 1 :(得分:0)
操作系统可能切换到您的线程的确切算法不是由C ++定义的,而是由您的OS调度程序定义的。
根据标准§30.3,如果t.joinable()
为真,那么可能存在与您的线程对象相对应的操作系统线程。请注意,即使线程已经运行完成,t.joinable()
也是如此,只要该线程尚未加入或分离即可。
如果你已经分离,那么对象就不再连接到底层的OS线程实现了,这通常是操作系统清理的责任(例如,在程序终止时),除非你做一些平台依赖的工作,比如使用本机句柄显式。分离后,该线程的代码可能仍在运行。