我不明白使用std::async
和std::lauch::async
標誌的原因,而不是簡單地調用傳遞給std::async
的函數。有特別保證嗎?什麼時候我需要使用std :: async(std :: launch :: async,func())而不是func()?
回答
根據the documentation,有是一個重載,只是該函數及其參數。您正在使用超載,接受更具體的政策。
async(f, args...)
相當於async(std::launch::async | std::launch::deferred, f, args...)
,其中這兩個標誌的存在保留這些給執行是否該功能簡單地從當前調用堆棧解耦合(推遲到第一非定時等待功能的執行;這叫做懶惰評估),或者實際上是多線程的。
你使用,通過給只std::launch::async
調用,確保該功能已在自己的線程中執行肯定,避免任何工作阻塞調用線程。
這兩種變體當然與直接調用f(args...)
完全不一樣,這可以保證立即進行評估。
關於'std :: launch :: async | std :: launch :: deferred'是它不僅實現了異步和延遲執行之間的選擇,而且還允許實現延遲_製作choice_。也就是說,實現可能不會立即選擇任何策略,但稍後可能會選擇執行異步執行(例如,在另一個線程完成並且核心可用後)。據我所知,微軟的實施是唯一利用這一點的實施方式,我相信他們有責任將此緯度納入規範。 – bames53
@ bames53:射殺! –
@ bames53 - 聽起來不奇怪。這只是基礎抽象的結果:可移植程序無法確定運行時庫何時決定處理該參數的方式,因此沒有可指定的內容。 –
是的調用線程不阻塞,因爲std :: async生成一個單獨的線程來調用該函數。這意味着如果你點擊一個GUI按鈕來開始處理一個複雜的任務,這將花費幾分鐘,然後GUI響應,儘管處理還沒有完成。
- 1. 用std :: launch :: sync模擬std :: async?
- 2. GCC的行爲與std :: async(std :: launch :: async)與Clang的行爲
- 3. 爲什麼要使用std :: async?
- 4. 何時使用std :: async vs std :: threads?
- 5. 什麼時候應該使用async/await,什麼時候不用?
- 6. 如何使用estimatedHeightForRowAtIndexPath和async func? swift
- 7. 什麼時候應該將std :: async與sync同時用作策略?
- 8. 用std :: async編輯數組
- 9. std :: async和std ::將來的行爲
- 10. 很多時候使用std :: async爲小任務性能友好?
- 11. 在構造函數中使用std :: async
- 12. 爲什麼人們使用setTimeout(「func()」,...)而不是setTimeout(func,...)
- 13. 有條件的std :: future和std :: async
- 14. Func for async進入死鎖狀態?
- 15. std :: launch :: async被阻塞,像一個同步進程
- 16. Swift:class func ....爲什麼在類中創建方法時使用this而不是func?
- 17. 是否有使用線程池的std :: async的實現?
- 18. std :: async - 與實現相關的用法?
- 19. 當使用std :: async時,C++「無法推導出模板參數」
- 20. 可以std :: async調用std :: function對象嗎?
- 21. 我們什麼時候需要使用posix_memalign而不是malloc?
- 22. 什麼時候在jQuery中的ajax函數中使用async false和async true
- 23. std :: async中的奇怪行爲
- 24. std :: async - 參數向量被破壞
- 25. std :: async variant對集合起作用
- 26. 你什麼時候使用std :: unordered_map :: emplace_hint?
- 27. 與std :: async並行的控制程度
- 28. 加速std:.vector填充新的C++ 11 std :: async
- 29. 什麼時候是std :: chrono epoch?
- 30. 爲什麼func()和func(void)不同
你確實在問'std :: lauch :: deferred'嗎?因爲'std :: lauch :: async'的行爲與調用該函數完全不同,在另一個線程中異步執行它(但也許你實際上首先要求理由這樣做,這將是一個更多根本問題,雖然)。 –
@LightnessRacesinOrbit我不確定您對問題標題的編輯(以及您的答案)與問題主體真正匹配。 –
@Christian Rau:在[文檔](http://en.cppreference.com/w/cpp/thread/async)中指定當我們用std :: lauch :: async標誌調用std :: async ,調用線程將阻塞,直到func()完成,所以我認爲我的原始問題/標題很好 – Guillaume07