2014-09-12 50 views
30

任何人都可以給出關於何時使用它們的高層次直覺?何時使用std :: async vs std :: threads?

參考文獻:

+0

使用哪一個你知道如何適用於你的問題。有些問題可以更好地映射到其中一個,這自然會反映在您的想法中。 – 2014-09-12 18:17:50

+0

但它們是否相同?我不這麼認爲。 std :: async是爲了簡化生活還是解決以前的C++問題? – 2014-09-12 18:19:46

+2

有趣的閱讀(關於'std :: async')如果使用g ++:[async(f)不是。](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51617),還有[this](http://stackoverflow.com/questions/17963172/why-using-stdasync-from-c11) – streppel 2014-09-12 18:29:11

回答

28

這不是一個真正的非此即彼的事情 - 你可以利用期貨(與承諾一起)與手動創建的std ::線程。使用std::async是一種便捷的方法,可以爲一些異步計算啓動線程,並通過未來編組結果,但std::async在當前標準中相當有限。如果接受來自微軟PPL的建議擴展,則它將變得更有用。

當前,std::async可能最適合處理非常長時間運行的計算或長時間運行的IO,適用於相當簡單的程序。儘管如此,它並不能保證低開銷(實際上它的指定方式使得難以在幕後實現線程池),所以它不適合更細粒度的工作負載。爲此,您需要使用std::thread來滾動您自己的線程池,或者使用諸如Microsoft的PPL或Intel的TBB之類的東西。

您還可以使用std::thread作爲以傳統和便攜方式編寫的'傳統'POSIX線程樣式代碼。

巴爾託什盧斯基討論了一些辦法std::async的限制,目前在他的文章中指定Async Tasks in C++11: Not Quite There Yet

+0

因此,如果我想編寫高效的代碼(或者線程被創建並頻繁地加入)最好堅持傳統的線程? – 2014-09-12 18:24:21

+2

好的線程被創建和頻繁地加入是你想避免高效的代碼:)這是std :: async的問題 - 它很可能通過發射一個新的線程而不是線程池來實現。如果你想要高效的細粒度線程工作負載,你通常需要像線程池這樣的東西。 – mattnewport 2014-09-12 18:27:16

+1

@mattnewport:其實,['std :: async'最經常使用線程池](http://stackoverflow.com/questions/15666443/which-stdasync-implementations-use-thread-pools)。但它不是必需的。 – 2014-09-12 18:29:53

4

一個簡單的原因,我發現的是,當你想一個方法來檢測(通過輪詢)是否異步的情況下工作已經完成。隨着std::thread,你必須自己管理它。使用std::async,您可以查詢std::future::valid()(或使用std::future::wait_for/wait_until(...))以瞭解何時完成。

相關問題