使用析构函数连接线程

V S*_*yas 5 c++ multithreading destructor

这是我的问题的延续:构造函数中的线程创建

现在我已经成功地在构造函数中创建了一个线程,我知道它必须被加入。在开发 API 时,我无法控制 main 函数,因此我无法在那里加入它。

考虑到该类的实例化对象具有应用程序的生命周期,在类析构函数中加入线程是否正确?

Ami*_*ory 8

你可以这么做。但是,您真的对启动新线程的机制感兴趣,还是对异步执行某些操作的效果感兴趣?如果是后者,则可以转向更高级别的async机制:

#include <iostream>
#include <future>


void bar()
{
    std::cout << "I'm bar" << std::endl;
}

class foo
{
public:
    foo() :
        m_f(std::async(
            std::launch::async,
            bar))
    {

    }

    ~foo()
    {
        m_f.get();
    }

private:
    std::future<void> m_f;
};

int main ()
{
    foo f;
}
Run Code Online (Sandbox Code Playgroud)
  • 您在构造函数中要求bar异步启动。您不关心自己管理线程 - 让库来处理它。

  • 将结果放入future成员中。

  • 在dtor,get未来。