There is an only kind of std::future
as resultant from creation from Async/Task STL function calls that is blocked. It is the one created by std::async
. This post will illustrate why it behaves just like that.
The reason why std::future
created from std::async
will block in its destructor is because of __future_base::_S_make_async_state()
function call which in turn calls to create _Async_state_impl
in which its destructor has the following definition (notice its call std::thread::join
) if it’s joinable then it will wait until the task is done to properly destroy itself.
// Must not destroy _M_result and _M_fn until the thread finishes.
// Call join() directly rather than through _M_join() because no other
// thread can be referring to this state if it is being destroyed.
~_Async_state_impl() { if (_M_thread.joinable()) _M_thread.join(); }
Pay a good attention at _Async_state_impl
which is mentioned to work with std::async
with std::launch::async
launching policy only, and not with other where else.
Above code can be seen in
future
header file bundled with gcc 9.1 on Linux, or similar on other platforms.
Oct, 14, 2019
First published on Oct, 8, 2019
Written by Wasin Thonkaew
In case of reprinting, comments, suggestions
or to do anything with the article in which you are unsure of, please
write e-mail to wasin[add]wasin[dot]io
Copyright © 2019-2021 Wasin Thonkaew. All Rights Reserved.