Warnings
âš The Challenge of
detach
: Of course we can uset.detach()
instead oft.join()
in the last program. The threadt
is not joinable anymore; therefore, its destructor didn’t callstd::terminate
. But now, we have another issue. The program behavior is undefined because the main program may complete before the threadt
has time to complete its work package; therefore, its lifetime is too short to display the ID.
Tips
🔑
scoped_thread
by Anthony WilliamsIf it’s too bothersome to manually take care of the lifetime of our threads, we can encapsulate an
std::thread
in our own wrapper class. This class should automatically calljoin
in its destructor. Of course, we can go the other way and calldetach
, but there is an issue withdetach
.Anthony Williams created a very useful class and presented it in his excellent book Concurrency in Action. He called the wrapper
scoped_thread
.scoped_thread
gets a threadt
in its constructor and checks ift
is still joinable. If the threadt
passed into the constructor is not joinable anymore, there is no need for thescoped_thread
. Ift
is joinable, the destructor callst.join()
. Because the copy constructor and copy assignment operator are declared asdelete
, instances ofscoped_thread
can not be copied to or assigned from.
Get hands-on with 1400+ tech skills courses.