std :: thread with finished function

时间:2016-10-10 20:45:59

标签: c++ multithreading c++11 stl

我有一个类似的线程:

std::thread t{ [](){} };

所以新线程突然结束。如果我没有调用join,那么操作系统可能会将上下文切换到这个" dead"线?或系统"注意到"这个线程没有活动,即使我从不打电话给join,也从不切换到它?

2 个答案:

答案 0 :(得分:1)

当你的线程完成时,它真的完成了。操作系统永远不会将上下文切换到它,因为无处可切换上下文。但是你的std :: thread对象仍然存在,你仍然可以在其上调用join。并且它会表现正常:一旦线程完成,就会立即返回。

答案 1 :(得分:0)

操作系统可能切换到您的线程的确切算法不是由C ++定义的,而是由您的OS调度程序定义的。

根据标准§30.3,如果t.joinable()为真,那么可能存在与您的线程对象相对应的操作系统线程。请注意,即使线程已经运行完成,t.joinable()也是如此,只要该线程尚未加入或分离即可。

如果你已经分离,那么对象就不再连接到底层的OS线程实现了,这通常是操作系统清理的责任(例如,在程序终止时),除非你做一些平台依赖的工作,比如使用本机句柄显式。分离后,该线程的代码可能仍在运行。