22

下面的async调用是阻塞的,因为返回的未来的析构函数是阻塞的:

void foo() {}

void foo_async() {
    std::async(std::launch::async, foo);
}

但我不想阻止!

我正在考虑使用以下解决方法:

void foo_async() {
    std::thread(foo).detach();
}

这个可以吗?或者您会推荐不同的解决方案吗?

4

2 回答 2

11

您可以使用以下版本的异步,它提供了一个非阻塞的未来。因此,如果您需要,您可以利用未来,而另一方面,当您想要一个即发即弃的任务时,您可以忽略它。

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;   
}
于 2013-04-30T09:32:40.943 回答
4

如果您真的想一劳永逸地调用foo(),我会说您的解决方法是可以的。

否则,只做auto f = std::async(std::launch::async, foo);,并可能从foo_async().

于 2013-04-30T09:24:39.703 回答