2013-04-30 196 views
19

async呼叫的下方,阻止因爲返回未來的析構函數被阻塞:解決異步的解決方法?

void foo() {} 

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

但我不希望阻止!

我正在考慮使用以下解決方法:

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

這是好嗎?或者你會推薦一個不同的解決方案?

+3

如果你不需要從任務中返回一個值或等待它完成,這對我來說似乎是合理的。 – jcoder 2013-04-30 09:22:55

回答

10

您可以使用以下版本的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; 
} 
+0

你能解釋爲什麼這是非阻塞的嗎?對我來說,一旦未來的析構函數被調用,它似乎仍然會阻止另一方。 – thejinx0r 2016-10-12 13:13:54

+0

@thejinx0r來自打包任務的未來析構函數不會阻止 – inf 2016-10-12 17:09:03

4

如果你真的想要開火併忘記呼叫foo(),我會說你的解決方法是好的。

否則,只要做auto f = std::async(std::launch::async, foo);,並可能從foo_async()返回未來。

+1

如果一個異常從'foo'逃脫,繁榮。 – 2013-04-30 10:29:58