2013-11-21 32 views
4

我不明白使用std::asyncstd::lauch::async標誌的原因,而不是簡單地調用傳遞給std::async的函數。有特別保證嗎?什麼時候我需要使用std :: async(std :: launch :: async,func())而不是func()?

+0

你確實在問'std :: lauch :: deferred'嗎?因爲'std :: lauch :: async'的行爲與調用該函數完全不同,在另一個線程中異步執行它(但也許你實際上首先要求理由這樣做,這將是一個更多根本問題,雖然)。 –

+0

@LightnessRacesinOrbit我不確定您對問題標題的編輯(以及您的答案)與問題主體真正匹配。 –

+0

@Christian Rau:在[文檔](http://en.cppreference.com/w/cpp/thread/async)中指定當我們用std :: lauch :: async標誌調用std :: async ,調用線程將阻塞,直到func()完成,所以我認爲我的原始問題/標題很好 – Guillaume07

回答

4

根據the documentation,有一個重載,只是該函數及其參數。您正在使用超載,接受更具體的政策

async(f, args...)相當於async(std::launch::async | std::launch::deferred, f, args...),其中這兩個標誌的存在保留這些給執行是否該功能簡單地從當前調用堆棧解耦合(推遲到第一非定時等待功能的執行;這叫做懶惰評估),或者實際上是多線程的。

使用,通過給std::launch::async調用,確保該功能已在自己的線程中執行肯定,避免任何工作阻塞調用線程。

這兩種變體當然與直接調用f(args...)完全不一樣,這可以保證立即進行評估。

+0

關於'std :: launch :: async | std :: launch :: deferred'是它不僅實現了異步和延遲執行之間的選擇,而且還允許實現延遲_製作choice_。也就是說,實現可能不會立即選擇任何策略,但稍後可能會選擇執行異步執行(例如,在另一個線程完成並且核心可用後)。據我所知,微軟的實施是唯一利用這一點的實施方式,我相信他們有責任將此緯度納入規範。 – bames53

+0

@ bames53:射殺! –

+0

@ bames53 - 聽起來不奇怪。這只是基礎抽象的結果:可移植程序無法確定運行時庫何時決定處理該參數的方式,因此沒有可指定的內容。 –

1

是的調用線程不阻塞,因爲std :: async生成一個單獨的線程來調用該函數。這意味着如果你點擊一個GUI按鈕來開始處理一個複雜的任務,這將花費幾分鐘,然後GUI響應,儘管處理還沒有完成。

相關問題