我使用new操作符创建了boost::thread对象,并且在没有等待这个线程完成其工作的情况下继续:
void do_work()
{
// perform some i/o work
}
boost::thread *thread = new boost::thread(&do_work);我想,当工作完成后,删除thread是必要的。在不显式等待线程终止的情况下,最好的方法是什么?
发布于 2010-10-20 01:19:30
boost::thread对象的生存期和本机线程的生存期是无关的。boost::thread对象随时可能超出作用域。
从boost::thread类documentation
正如文件的生命周期可能不同于表示文件的iostream对象的生命周期一样,执行线程的生命周期也可能不同于表示执行线程的线程对象。特别是,在调用join()之后,执行的线程将不再存在,即使线程对象继续存在,直到其正常生命周期结束。反之亦然;如果线程对象在没有首先调用join()的情况下被销毁,则执行的线程将继续执行,直到其初始函数完成为止。
编辑:如果您只需要启动一个线程,而不调用join,那么您可以将线程的构造函数用作一个函数:
// Launch thread.
boost::thread(&do_work); 但是,我不建议您这样做,即使您认为您确信线程将在main()之前完成。
发布于 2010-10-20 01:20:10
您可以使用
boost::thread t(&do_work);
t.detach();一旦线程被分离,它就不再归boost::thread对象所有;该对象可以被销毁,线程将继续运行。如果对象拥有一个正在运行的线程,boost::thread析构函数也会调用detach(),所以让t销毁也会有同样的结果。
发布于 2010-10-20 11:10:34
我建议你使用boost::shared_ptr,这样你就不用担心什么时候删除线程对象了。
boost::shared_ptr<boost::thread> thread(new boost::thread(&do_work));https://stackoverflow.com/questions/3970818
复制相似问题