繁体   English   中英

C ++ 11:如何在执行函数退出后立即加入std :: thread?

[英]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()。

两个问题:

  1. 如果一个线程的执行函数从未与主线程连接,则执行函数已经退出资源,或者是执行函数退出时释放的线程和所有相关资源(这样连接()可能是不必要的并立即返回)?

  2. 是否可以从主线程调用auxThread上的join()以响应run()退出而不阻塞主线程?

如果一个线程的执行函数从未与主线程连接,那么它就会退出资源

也许。 这取决于您的实施,但通常不是。

是执行函数退出时释放的线程和所有相关资源

可能,如果没有,那么OS会尽快。 这也是实现定义的。

是否可以从主线程调用auxThread上的join()以响应run()退出而不阻塞主线程?

是的,但没有任何意义。 那唯一join确实是块,直到正在执行的功能完成。 run完成执行后再次调用join是不必要的,基本上是无操作。

此外,来自线程的“资源”是最小的。 我不希望像你这样的单个线程分配大量内存。 RAM现在非常便宜,所以你不必担心,因为你没有并行执行5M线程,这在传统计算机上无论如何都没有意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM