沒有,如果你使用的std::launch::async
政策則異步在一個新的線程中運行。如果您未指定政策,則可能會在新線程中運行。
基本上在你調用未來與你的異步函數foo相關聯的行中,程序會阻塞,直到foo執行完成。
只塊,如果富還沒有完成,但如果它是異步運行(例如,由於您使用std::launch::async
政策),你需要它之前它可能已經完成。
- 這取決於完全相同的外部庫等等,並且更好的,無阻塞的解決方案,這意味着並行線程,如果你想使用std ::異步你需要並行線程。
錯誤,它沒有使用P線程實現(在Windows上它不是,它使用ConcRT功能。)
在這一點上很自然的我問爲什麼選擇std :: async即使是一組簡單的函子?
因爲它保證線程安全並在線程間傳播異常。你能用一套簡單的仿函數來做到嗎?
這是一個解決方案,甚至根本沒有擴展規模,您呼叫的未來越多,程序響應也就越少。
不一定。如果您沒有指定啓動策略,那麼智能實現可以決定是否啓動新線程,或返回延遲函數,或返回稍後決定的事情,以便有更多資源可用時。
現在的確,在GCC的實現中,如果你沒有提供啓動策略,那麼對於當前版本,它將永遠不會運行在新線程中(對此有一個bugzilla report),但這是該實現的屬性,而不是一般的std::async
。您不應該將標準中的規範與特定的實現混淆。閱讀一個標準庫的實現是學習C++ 11的一個不好的方法。
您能否展示一個被授予以異步,非阻塞方式執行的示例?
這不應該阻止:
auto fut = std::async(std::launch::async, doSomethingThatTakesTenSeconds);
auto result1 = doSomethingThatTakesTwentySeconds();
auto result2 = fut.get();
通過指定的啓動策略將強制異步執行的,如果你,而它的執行,然後做其他工作,當你需要它的結果將準備。
@rsaxvc你調用異步函數,例如'future.get()' – user2485710
你的假設是錯誤的。 async()旨在提供一個同步點,以便您可以獲取異步評估函數的結果。 – DanielKO
與其他選項相比,C++目前的「異步」概念並沒有真正將任何重要的東西(可移植性除外)帶到表中。一旦獲得持續完成支持(這是幾乎所有其他平臺稱爲「異步」的重要組成部分),我懷疑你會發現它有更多的用途。 –