18

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

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

boost::thread *thread = new boost::thread(&do_work);

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

4

4 回答 4

21

对象的boost::thread生命周期和本机线程的生命周期是不相关的。boost::thread对象随时可能超出范围。

boost::thread文档

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

编辑:如果您只需要启动一个线程并且从不调用join,您可以将线程的构造函数用作函数:

    // Launch thread.
boost::thread(&do_work); 

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

于 2010-10-19T17:19:30.097 回答
13

您可以使用

boost::thread t(&do_work);
t.detach();

一旦线程被分离,它就不再归boost::thread对象所有;对象可以被销毁,线程将继续运行。如果对象拥有一个正在运行的线程,boost::thread析构函数也会调用detach(),因此让tget 销毁将具有相同的结果。

于 2010-10-19T17:20:09.847 回答
3

我建议你使用 boost::shared_ptr,这样你就不会在意何时删除线程对象。

boost::shared_ptr<boost::thread&gt; thread(new boost::thread(&do_work));
于 2010-10-20T03:10:34.260 回答
0

你应该看看线程中断

这篇文章也不错。

http://www.boost.org/doc/libs/1_38_0/doc/html/thread/thread_management.html

于 2010-10-19T17:28:31.140 回答