首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在boost::thread对象完成工作后立即删除它的最好方法是什么?

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

Stack Overflow用户
提问于 2010-10-20 01:08:19
回答 4查看 15.6K关注 0票数 18

我使用new操作符创建了boost::thread对象,并且在没有等待这个线程完成其工作的情况下继续:

代码语言:javascript
运行
复制
void do_work()
{
    // perform some i/o work
}

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

我想,当工作完成后,删除thread是必要的。在不显式等待线程终止的情况下,最好的方法是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-20 01:19:30

boost::thread对象的生存期和本机线程的生存期是无关的。boost::thread对象随时可能超出作用域。

boost::threaddocumentation

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

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

代码语言:javascript
运行
复制
    // Launch thread.
boost::thread(&do_work); 

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

票数 21
EN

Stack Overflow用户

发布于 2010-10-20 01:20:10

您可以使用

代码语言:javascript
运行
复制
boost::thread t(&do_work);
t.detach();

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

票数 13
EN

Stack Overflow用户

发布于 2010-10-20 11:10:34

我建议你使用boost::shared_ptr,这样你就不用担心什么时候删除线程对象了。

代码语言:javascript
运行
复制
boost::shared_ptr<boost::thread> thread(new boost::thread(&do_work));
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3970818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档