Ответ 1
Вы можете использовать следующую версию async, которая обеспечивает неблокирующее будущее. Таким образом, вы можете воспользоваться будущим, если вам это нужно, а с другой стороны вы можете просто игнорировать его, когда хотите выполнить задачу "огонь и забвение".
template< class Function, class... Args>
std::future<typename std::result_of<Function(Args...)>::type> async( Function&& f, Args&&... args )
{
typedef typename std::result_of<Function(Args...)>::type R;
auto bound_task = std::bind(std::forward<Function>(f), std::forward<Args>(args)...);
std::packaged_task<R()> task(std::move(bound_task));
auto ret = task.get_future();
std::thread t(std::move(task));
t.detach();
return ret;
}