The async
call below is blocking because the destructor of the returned future is blocking:
void foo() {}
void foo_async() {
std::async(std
You could use the following version of async which provides a non-blocking future. As such you can take advantage of the future if you need it and on the other side you can just ignore it when you want a fire-and-forget task.
template< class Function, class... Args>
std::future::type> async( Function&& f, Args&&... args )
{
typedef typename std::result_of::type R;
auto bound_task = std::bind(std::forward(f), std::forward(args)...);
std::packaged_task task(std::move(bound_task));
auto ret = task.get_future();
std::thread t(std::move(task));
t.detach();
return ret;
}