stdpackaged 任务和 stdfuture

std::packaged_task 绑定一个函数及其返回类型的相关承诺:

template<typename F>
auto async_deferred(F&& func) -> std::future<decltype(func())>
{
    auto task   = std::packaged_task<decltype(func())()>(std::forward<F>(func));
    auto future = task.get_future();

    std::thread(std::move(task)).detach();

    return std::move(future);
}

线程立即开始运行。我们可以将其分离,或者在范围的最后加入它。当函数调用 std::thread 完成时,结果就绪。

请注意,这与 std::async 略有不同,其中被破坏时返回的 std::future 实际上会阻塞直到线程完成。