2012-06-05 82 views
49

是否可以檢查std::future是否已完成?至於我可以告訴唯一的方法來做到這一點將撥打電話wait_for零持續時間,並檢查狀態是否ready或沒有,但有沒有更好的辦法?獲取std :: future的狀態

+0

檢查「有效」? –

+6

@CatPlusPlus除非我錯了,否則'valid'只會檢查未來是否有共享狀態(即它將返回'true',直到將來調用'get')。 –

+0

所以,如果'get'已被調用並返回存儲的值,那麼你是否仍然需要'true'? (我不知道爲什麼這會有用,因爲你只能得到一次價值。) –

回答

36

你是對的,除了過去打電話給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,如果您希望在經過一定時間後或系統負載較低時想同步運行延遲任務。

+1

wait_for不會改變未來,因此參數可以聲明爲const。 –

+1

如果get已被調用或未來未被初始化,請考慮首先檢查valid()以避免運行時錯誤。 –

+2

是wait_for(chrono :: seconds(0))保證立即返回,或者它可以在某些實現上產生幾毫秒的線程控制權?這是非常重要的知道幾毫秒是編碼遊戲很多時間... – kynnysmatto

6

我的第一個打賭是打電話wait_for持續時間爲0,並檢查可能是future_status::readyfuture_status::deferredfuture_status::timeout之一的結果代碼。

cppreference他們聲稱valid()檢查結果是可用的,但標準說valid()將返回true如果*this指共享狀態,獨立地那狀態是否是準備與否。

+4

cppreference現在已更新,並指出「檢查未來是否具有共享狀態」。 (不知道你是否想刪除第二段或編輯它,所以我不會自己修改它)。 – Default

7

std :: future有一個is_ready成員函數in the works。同時,VC實現有一個_Is_ready()成員。