的async
呼叫的下方,阻止因爲返回未來的析構函數被阻塞:解決異步的解決方法?
void foo() {}
void foo_async() {
std::async(std::launch::async, foo);
}
但我不希望阻止!
我正在考慮使用以下解決方法:
void foo_async() {
std::thread(foo).detach();
}
這是好嗎?或者你會推薦一個不同的解決方案?
的async
呼叫的下方,阻止因爲返回未來的析構函數被阻塞:解決異步的解決方法?
void foo() {}
void foo_async() {
std::async(std::launch::async, foo);
}
但我不希望阻止!
我正在考慮使用以下解決方法:
void foo_async() {
std::thread(foo).detach();
}
這是好嗎?或者你會推薦一個不同的解決方案?
您可以使用以下版本的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;
}
如果你真的想要開火併忘記呼叫foo()
,我會說你的解決方法是好的。
否則,只要做auto f = std::async(std::launch::async, foo);
,並可能從foo_async()
返回未來。
如果一個異常從'foo'逃脫,繁榮。 – 2013-04-30 10:29:58
如果你不需要從任務中返回一個值或等待它完成,這對我來說似乎是合理的。 – jcoder 2013-04-30 09:22:55