是否可以檢查std::future
是否已完成?至於我可以告訴唯一的方法來做到這一點將撥打電話wait_for
零持續時間,並檢查狀態是否ready
或沒有,但有沒有更好的辦法?獲取std :: future的狀態
回答
你是對的,除了過去打電話給wait_until
(這是等價的),沒有更好的辦法。
如果你想要一個更方便的語法你總是可以寫一個小包裝:
template<typename R>
bool is_ready(std::future<R> const& f)
{ return f.wait_for(std::chrono::seconds(0)) == std::future_status::ready; }
注:如果函數被延遲,這將永遠不會返回true,所以最好直接檢查wait_for
,如果您希望在經過一定時間後或系統負載較低時想同步運行延遲任務。
wait_for不會改變未來,因此參數可以聲明爲const。 –
如果get已被調用或未來未被初始化,請考慮首先檢查valid()以避免運行時錯誤。 –
是wait_for(chrono :: seconds(0))保證立即返回,或者它可以在某些實現上產生幾毫秒的線程控制權?這是非常重要的知道幾毫秒是編碼遊戲很多時間... – kynnysmatto
我的第一個打賭是打電話wait_for
持續時間爲0,並檢查可能是future_status::ready
,future_status::deferred
或future_status::timeout
之一的結果代碼。
在cppreference他們聲稱valid()
檢查結果是可用的,但標準說valid()
將返回true
如果*this
指共享狀態,獨立地那狀態是否是準備與否。
cppreference現在已更新,並指出「檢查未來是否具有共享狀態」。 (不知道你是否想刪除第二段或編輯它,所以我不會自己修改它)。 – Default
std :: future有一個is_ready成員函數in the works。同時,VC實現有一個_Is_ready()成員。
- 1. move-semantics和std :: future
- 2. 有條件的std :: future和std :: async
- 3. 如何終止std :: future?
- 4. 異常傳播和std :: future
- 5. std :: bad_alloc之後std :: vector的狀態
- 6. 獲取狀態欄
- 7. 獲取xml狀態
- 8. SmartLifecycleRoleController獲取狀態
- 9. 獲取Facebook狀態
- 10. HttpClient的獲取狀態碼
- 11. 獲取fb狀態的like_info
- 12. 獲取Facebook的狀態
- 13. 獲取GPS的狀態
- 14. 獲取MediaPlayer的狀態
- 15. 模板std :: future的問題返回
- 16. 瞭解std :: future的延續::然後
- 17. 從休眠狀態獲取SQL獲取
- 18. 爲什麼std :: future不會阻止
- 19. 與std :: future :: unwrap異常傳播競賽
- 20. 如何獲取QScrollBar狀態
- 21. TcpClient ConnectAsync獲取狀態
- 22. Facebook API獲取狀態
- 23. 獲取IPv6配置狀態
- 24. 獲取休眠狀態
- 25. 獲取線程狀態
- 26. Facebook獲取用戶狀態
- 27. 獲取狀態爲0
- 28. parse.com獲取狀態404
- 29. AS3 - 獲取Google Analytics狀態
- 30. 獲取不同狀態
檢查「有效」? –
@CatPlusPlus除非我錯了,否則'valid'只會檢查未來是否有共享狀態(即它將返回'true',直到將來調用'get')。 –
所以,如果'get'已被調用並返回存儲的值,那麼你是否仍然需要'true'? (我不知道爲什麼這會有用,因爲你只能得到一次價值。) –