回答
這不是一個真正的非此即彼的事情 - 你可以利用期貨(與承諾一起)與手動創建的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
因此,如果我想編寫高效的代碼(或者線程被創建並頻繁地加入)最好堅持傳統的線程? – 2014-09-12 18:24:21
好的線程被創建和頻繁地加入是你想避免高效的代碼:)這是std :: async的問題 - 它很可能通過發射一個新的線程而不是線程池來實現。如果你想要高效的細粒度線程工作負載,你通常需要像線程池這樣的東西。 – mattnewport 2014-09-12 18:27:16
@mattnewport:其實,['std :: async'最經常使用線程池](http://stackoverflow.com/questions/15666443/which-stdasync-implementations-use-thread-pools)。但它不是必需的。 – 2014-09-12 18:29:53
一個簡單的原因,我發現的是,當你想一個方法來檢測(通過輪詢)是否異步的情況下工作已經完成。隨着std::thread
,你必須自己管理它。使用std::async
,您可以查詢std::future::valid()
(或使用std::future::wait_for/wait_until(...)
)以瞭解何時完成。
- 1. 什麼時候我需要使用std :: async(std :: launch :: async,func())而不是func()?
- 2. 用std :: launch :: sync模擬std :: async?
- 3. std :: vector vs std :: insert
- 4. std :: mem_fun vs std :: mem_fn
- 5. std :: async和std ::將來的行爲
- 6. 有條件的std :: future和std :: async
- 7. 用std :: async編輯數組
- 8. GCC的行爲與std :: async(std :: launch :: async)與Clang的行爲
- 9. 爲什麼要使用std :: async?
- 10. 在構造函數中使用std :: async
- 11. std :: unique_ptr :: release()vs std :: move()
- 12. std :: move VS std ::轉發
- 13. std :: list vs std :: vector迭代
- 14. 區別:std :: runtime_error vs std :: exception()
- 15. setrlimit()不影響衍生的std :: threads
- 16. 可以std :: async調用std :: function對象嗎?
- 17. Functors vs. std :: bind
- 18. snprintf vs std :: stringstream
- 19. 如何使用std :: istringstream使用std :: wstring?
- 20. std ::使用std :: promise時的Future_error
- 21. 如何將對象移動到std :: async()?
- 22. std :: async variant對集合起作用
- 23. std :: async - 與實現相關的用法?
- 24. 當使用std :: async時,C++「無法推導出模板參數」
- 25. 很多時候使用std :: async爲小任務性能友好?
- 26. 可以使用boost :: threads中的std :: this_thread *函數嗎?
- 27. 的std ::時辰:: SYSTEM_CLOCK VS的std ::時辰:: high_resolution_clock行爲
- 28. 通過使用std :: get,std :: tuple_size,std :: tuple_element
- 29. 的std ::刪除VS的std ::的remove_if
- 30. std:排序vs插入std :: set
使用哪一個你知道如何適用於你的問題。有些問題可以更好地映射到其中一個,這自然會反映在您的想法中。 – 2014-09-12 18:17:50
但它們是否相同?我不這麼認爲。 std :: async是爲了簡化生活還是解決以前的C++問題? – 2014-09-12 18:19:46
有趣的閱讀(關於'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