What’s the best way to delete boost::thread object right after its work is complete?

浪子不回头ぞ 提交于 2019-11-26 23:27:57

问题


I create boost::thread object with a new operator and continue without waiting this thread to finish its work:

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

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

I guess, it’s necessary to delete thread when the work is done. What’s the best way to this without explicitly waiting for thread termination?


回答1:


The boost::thread object's lifetime and the native thread's lifetime are unrelated. The boost::thread object can go out of scope at any time.

From the boost::thread class documentation

Just as the lifetime of a file may be different from the lifetime of an iostream object which represents the file, the lifetime of a thread of execution may be different from the thread object which represents the thread of execution. In particular, after a call to join(), the thread of execution will no longer exist even though the thread object continues to exist until the end of its normal lifetime. The converse is also possible; if a thread object is destroyed without join() having first been called, the thread of execution continues until its initial function completes.

Edit: If you just need to start a thread and never invoke join, you can use the thread's constructor as a function:

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

However, I don't suggest you do that, even if you think you're sure the thread will complete before main() does.




回答2:


You can use

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

Once the thread is detached it is no longer owned by the boost::thread object; the object can be destroyed and the thread will continue to run. The boost::thread destructor also calls detach() if the object owns a running thread, so letting t get destroyed will have the same result.




回答3:


I suggest you use boost::shared_ptr, so you won't take care when to delete thread object.

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



回答4:


You should take a look at thread interruption.

This article is good also.

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



来源:https://stackoverflow.com/questions/3970818/what-s-the-best-way-to-delete-boostthread-object-right-after-its-work-is-compl

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!