C++ C++;11:如何在std::线程的执行函数退出时加入它?

C++ C++;11:如何在std::线程的执行函数退出时加入它?,c++,multithreading,c++11,C++,Multithreading,C++11,我有以下类,它的一个成员字段是std::thread: class MyClass { private: std::thread auxThread; void run(); public: ~MyClass(); void start(); } MyClass:~MyClass() { if (auxThread.joinable()) auxThread.join(); } void MyClass::run() { //d

我有以下类,它的一个成员字段是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析构函数中完成时。它看起来可以用来唤醒一个睡眠中的主线程并完成这项任务,但我不想阻止主线程,除非(希望)使用join()短暂地阻止它

两个问题:

  • 如果某个线程的执行函数从未与主线程连接,那么该线程的执行函数是否已退出资源消耗,或者当执行函数退出时,该线程和所有相关资源是否已释放(这样join()可能不必要并立即返回)

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

  • 如果某个线程的执行函数从未与主线程连接,则该线程已退出资源消耗

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

    当执行函数退出时,线程和所有相关资源是否被释放

    可能,如果没有,那么尽快由操作系统。这也是实现定义的

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

    是的,但是没有任何意义。
    join
    所做的唯一一件事就是阻塞,直到正在执行的函数完成为止。在
    run
    完成执行后再次调用
    join
    是不必要的,基本上是禁止操作的


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

    1)不,这不会消耗资源,2)不
    join()
    但你可以
    detach()
    如果你真的不关心线程,请不要过早地优化它。请注意,你想调用
    join()
    的主要原因不是为了释放资源,而是为了在修改进程/环境之前保证线程已经死了,并且已经消失,而这种方式可能会导致线程调用未定义的行为。尤其要在程序退出之前
    join()
    所有线程,因为在
    main()
    返回后执行的运行时清理代码可能会清理运行中线程可能认为仍然存在的数据结构,当
    main()
    返回时,如果任何线程仍在运行,则在关机时会导致偶尔的崩溃。