Thread Lifetime Management: Warnings and Tips
The Challenge of
detach: Of course you can use
t.join()in the last program. The thread
tis not joinable any more; therefore, its destructor didn’t call
std::terminate. But now you have another issue. The program behaviour is undefined because the main program may complete before the thread
thas time to complete its workpackage; therefore, its lifetime is too short to display the id. For more details, see lifetime issues of variables.
scoped_threadby Anthony Williams
If it’s too bothersome for you to manually take care of the lifetime of your threads, you can encapsulate a
std::threadin your own wrapper class. This class should automatically call join in its destructor. Of course you can go the other way and call detach, but there is an issue with detach.
Anthony Williams created such a useful class and presented it in his excellent book Concurrency in Action. He called the wrapper
scoped_threadgets a thread
tin its constructor and checks if
tis still joinable. If the thread
tpassed into the constructor is not joinable anymore, there is no need for the
tis joinable, the destructor calls
t.join(). Because the copy constructor and copy assignment operator are declared as
delete, instances of
scoped_threadcan not be copied to or assigned from.