我一直在考慮std::async
以及如何在未來的編譯器實現中使用它。但是,現在我有點卡住了感覺像設計缺陷的東西。std :: async - 與實現相關的用法?
std::async
幾乎與實現有關,可能有兩個變種launch::async
,一個將任務啓動到新線程中,另一個使用線程池/任務調度程序。
但是,根據用於實施std::async
的這些變體中的哪一個,使用情況會有很大差異。
對於基於「線程池」的變體,您將能夠啓動大量小型任務,而不用擔心很多開銷,但是,如果其中一個任務在某個時間點阻塞了,該怎麼辦?
另一方面,「啓動新線程」變體不會遇到阻塞任務的問題,另一方面,啓動和執行任務的開銷將非常高。
線程池: +低開銷,-never曾經阻止
推出新的線程: +罰款塊,志高開銷
所以基本上取決於實施,我們使用std::async
的方式會非常謹慎。如果我們有一個與一個編譯器兼容的程序,它可能會在另一個編譯器上運行。
這是設計嗎?或者我錯過了什麼?你會認爲這個和我一樣是個大問題嗎?
在當前的規範中,我缺少類似std::oversubscribe(bool)
的內容,以便實現依賴於std::async
的使用。
編輯:據我已閱讀,C++ 11標準文檔不會給任何提示關於發送到std::async
的任務是否可能會阻塞。
就像一個加法:http://en.cppreference.com/w/cpp/thread/async提供了一個非常簡單而實際的阻止'std :: async'調用的例子。 – KillianDS 2012-02-20 15:50:29
您似乎認爲線程池具有固定的大小。實際上,很多都是動態調整大小的,所以阻塞不是問題。 – 2014-01-22 23:24:13
@MooingDuck:TBB和Concrt都沒有「動態」大小的線程池。你知道哪些線程池是動態調整大小的?即使你有一個動態調整大小的線程池,你反而會遇到超額訂閱的問題,並且需要任何啓發式的開銷來跟蹤何時添加新線程和刪除舊線程。 – ronag 2014-01-22 23:31:42