Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 815
itsvetkov Avatar asked Oct 19 '10 17:10

itsvetkov


People also ask

How do I stop a thread boost?

Interrupting a Thread A running thread can be interrupted by calling the interrupt() member function on the corresponding boost::thread object. If the thread doesn't have a boost::thread object (e.g the initial thread of the application), then it cannot be interrupted.

Is delete thread safe C++?

The C++ new and delete operators are thread safe, but this means that a thread may have to wait for a lock on these operations. Once memory is obtained for a thread, the thread_alloc memory allocator keeps that memory available for the thread so that it can be re-used without waiting for a lock.

How do you delete a thread in C++?

The destructor std::thread::~thread() can only terminate the thread when the thread is still joinable . A C++ thread is joinable after it is started and before calling join or detach (see this example). So for joined/detached thread, the std::thread destructor cannot terminate the thread at all.

What is boost thread C++?

Boost. Thread is the library that allows you to use threads. Furthermore, it provides classes to synchronize access on data which is shared by multiple threads. Threads have been supported by the standard library since C++11.


3 Answers

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.

like image 181
André Caron Avatar answered Oct 17 '22 00:10

André Caron


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.

like image 37
James McNellis Avatar answered Oct 17 '22 01:10

James McNellis


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));
like image 35
leo Avatar answered Oct 17 '22 01:10

leo