[英]C++11: How can I join a std::thread as soon as its execution function exits?
我有以下类,其std :: thread作为其成员字段之一:
class MyClass {
private:
std::thread auxThread;
void run();
public:
~MyClass();
void start();
}
MyClass:~MyClass() {
if (auxThread.joinable())
auxThread.join();
}
void MyClass::run() {
//do stuff
}
void MyClass::start() {
auxThread = std::thread (&MyClass::run, this); //Move assignment
}
我可以按需启动auxThread,这要归功于使用空构造函数初始化它,然后将其分配给与实际执行线程关联的std :: thread对象(通过start()函数),但最小化系统资源用法我想在run()退出后立即加入()auxThread与主线程,即当auxThread的工作完成而不是在MyClass析构函数中。 看起来condition_variable可以用来唤醒一个睡眠的主线程并完成这个,但我不想阻止主线程,除了(希望)简单地用join()。
两个问题:
如果一个线程的执行函数从未与主线程连接,则执行函数已经退出资源,或者是执行函数退出时释放的线程和所有相关资源(这样连接()可能是不必要的并立即返回)?
是否可以从主线程调用auxThread上的join()以响应run()退出而不阻塞主线程?
如果一个线程的执行函数从未与主线程连接,那么它就会退出资源
也许。 这取决于您的实施,但通常不是。
是执行函数退出时释放的线程和所有相关资源
可能,如果没有,那么OS会尽快。 这也是实现定义的。
是否可以从主线程调用auxThread上的join()以响应run()退出而不阻塞主线程?
是的,但没有任何意义。 那唯一join
确实是块,直到正在执行的功能完成。 在run
完成执行后再次调用join
是不必要的,基本上是无操作。
此外,来自线程的“资源”是最小的。 我不希望像你这样的单个线程分配大量内存。 RAM现在非常便宜,所以你不必担心,因为你没有并行执行5M线程,这在传统计算机上无论如何都没有意义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.