在工作完成后立即删除boost :: thread对象的最佳方法是什么?

its*_*kov 17 c++ multithreading boost boost-thread

boost::thread使用new运算符创建对象并继续而不等待此线程完成其工作:

void do_work()
{
    // perform some i/o work
}

boost::thread *thread = new boost::thread(&do_work);
Run Code Online (Sandbox Code Playgroud)

我想,有必要删除thread工作完成时.没有明确等待线程终止,最好的方法是什么?

And*_*ron 20

boost::thread对象的生命周期和本地线程的生命周期无关.该boost::thread对象可以在任何时候走出去的范围.

boost::thread课程文档

正如文件的生命周期可能与表示文件的iostream对象的生命周期不同,执行线程的生命周期可能与表示执行线程的线程对象不同.特别是,在调用join()之后,即使线程对象继续存在直到其正常生命周期结束,执行线程也将不再存在.反过来也是可能的; 如果在没有首先调用join()的情况下销毁线程对象,则执行线程将继续,直到其初始函数完成.

编辑:如果你只需要启动一个线程并且永远不会调用join,你可以使用线程的构造函数作为函数:

    // Launch thread.
boost::thread(&do_work); 
Run Code Online (Sandbox Code Playgroud)

但是,我不建议你这样做,即使你认为你确定线程会在之前main()完成.


Jam*_*lis 13

您可以使用

boost::thread t(&do_work);
t.detach();
Run Code Online (Sandbox Code Playgroud)

一旦线程被分离,它就不再被boost::thread对象拥有; 对象可以被销毁,线程将继续运行.该boost::thread析构函数还呼吁detach(),如果对象拥有一个正在运行的线程,所以又让t被摧毁将有同样的结果.