Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么&x2019;在boost::thread对象的工作完成后,删除它的最佳方法是什么?_C++_Multithreading_Boost_Boost Thread - Fatal编程技术网

C++ 什么&x2019;在boost::thread对象的工作完成后,删除它的最佳方法是什么?

C++ 什么&x2019;在boost::thread对象的工作完成后,删除它的最佳方法是什么?,c++,multithreading,boost,boost-thread,C++,Multithreading,Boost,Boost Thread,我使用new操作符创建boost::thread对象,并在不等待此线程完成其工作的情况下继续: void do_work() { // perform some i/o work } boost::thread *thread = new boost::thread(&do_work); 我想,当工作完成时,有必要删除线程。没有显式等待线程终止的最佳方法是什么?对象的生存期和本机线程的生存期是不相关的。boost::thread对象可以随时超出范围 从boost::threa

我使用
new
操作符创建
boost::thread
对象,并在不等待此线程完成其工作的情况下继续:

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

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

我想,当工作完成时,有必要删除
线程。没有显式等待线程终止的最佳方法是什么?

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

boost::thread

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

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

    // Launch thread.
boost::thread(&do_work); 
但是,我不建议您这样做,即使您确信线程将在
main()
之前完成。

您可以使用

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

您应该看看

也很好


我建议您使用boost::shared\u ptr,这样您就不会在意何时删除线程对象

boost::shared_ptr<boost::thread> thread(new boost::thread(&do_work));
boost::shared_ptr thread(新的boost::thread(&do_work));

为什么要动态创建线程?@Martin York:因为我不想让thread对象在离开变量的作用域后被销毁。但是如果你让它脱离作用域,那么你就无法访问它(因此你就泄漏了)。没有对的访问意味着你不能用它做任何事情,而且实际的执行线程仍然是活动的,所以它看起来毫无意义。注意:你不应该有这样的原始指针。@Martin York:我知道。也许这是一个糟糕的代码示例。实际上,我假设指向线程对象的指针存储在某个地方,以便以后删除它。我的问题是如何在线程终止后立即删除它,但事实证明,在线程终止之前可以安全地删除线程对象。谢谢。我是一个新手,所以问题在于我对它的工作原理有误解。据我所知,这就是原生线程在大多数平台上的工作原理。因此,除非线程析构函数调用join(),这在出现异常时会很混乱,否则这只是一个正常的结果。当
do\u work
完成时,如何删除此线程对象?