我boost::thread
使用运算符创建对象new
并继续而不等待该线程完成其工作:
void do_work()
{
// perform some i/o work
}
boost::thread *thread = new boost::thread(&do_work);
我想,有必要thread
在工作完成后删除。没有明确等待线程终止的最佳方法是什么?
我boost::thread
使用运算符创建对象new
并继续而不等待该线程完成其工作:
void do_work()
{
// perform some i/o work
}
boost::thread *thread = new boost::thread(&do_work);
我想,有必要thread
在工作完成后删除。没有明确等待线程终止的最佳方法是什么?
对象的boost::thread
生命周期和本机线程的生命周期是不相关的。boost::thread
对象随时可能超出范围。
从boost::thread
类文档
正如文件的生命周期可能与代表文件的 iostream 对象的生命周期不同一样,执行线程的生命周期也可能与代表执行线程的线程对象不同。特别是,在调用 join() 之后,执行线程将不再存在,即使线程对象继续存在直到其正常生命周期结束。反过来也是可能的;如果线程对象在没有先调用 join() 的情况下被销毁,则执行线程将继续执行,直到其初始函数完成。
编辑:如果您只需要启动一个线程并且从不调用join
,您可以将线程的构造函数用作函数:
// Launch thread.
boost::thread(&do_work);
但是,我不建议您这样做,即使您认为您确定线程会在此之前main()
完成。
您可以使用
boost::thread t(&do_work);
t.detach();
一旦线程被分离,它就不再归boost::thread
对象所有;对象可以被销毁,线程将继续运行。如果对象拥有一个正在运行的线程,boost::thread
析构函数也会调用detach()
,因此让t
get 销毁将具有相同的结果。
我建议你使用 boost::shared_ptr,这样你就不会在意何时删除线程对象。
boost::shared_ptr<boost::thread> thread(new boost::thread(&do_work));