2014-01-19 60 views
0

我有以下的C++代碼11:std ::未來超時太早,替代?

auto f = std::async(std::launch::async, []() { myfunction(); }); 
std::future_status status; 
do { 
    status = f.wait_for(std::chrono::seconds(1)); 
    if (status == std::future_status::timeout) { 
     fprintf(stderr, "Hello!\n"); 
    } 
} while (status != std::future_status::ready); 

在我的筆記本電腦這運行正常(gcc版本4.7.3(Ubuntu的/ Linaro的4.7.3-1ubuntu1)),即每隔一myfunction()我跑得到一個「你好!」輸出。

但是,在我的ARM板上安裝了gcc 4.7.3版20130328(預發佈)(crosstool-NG linaro-1.13.1-4.7-2013.04-20130415 - Linaro GCC 2013.04),我立即得到輸出,沒有明顯延遲(即它不會等待第一秒),也只是繼續打印「你好!」直到myfunction()完成。

根據http://en.cppreference.com/w/cpp/thread/future/wait_for我應該只獲得超時狀態當且僅當超時已過期。

我懷疑這可能是由於GCC中的「定時等待函數不返回future_status :: deferred」(參考問題C++ 11 future_status::deferred not working)。然而myfunction()運行,所以最終它不應該總是返回「超時」,不應該嗎?

有沒有人在ARM平臺上有未來:: wait_for的經驗,或者有人可以在這個問題上找到一些啓示嗎?

+4

根據我的經驗,一些stdlibC++在x86上並沒有完全保持最新,我認爲它在ARM上更糟糕。你嘗試過boost :: future嗎?可能你*使用* std :: future超時太早。 – user3125280

+0

不,還沒有。我試圖限制我們使用外部庫,尤其是如果標準庫中有(或者應該是)實現。 – Frankie

+0

標準庫只是提升的一個端口 - 如果C++ 11版本不能在你的系統上運行,boost可能會有這種可能。無論如何他們返回什麼狀態? – user3125280

回答

0

我更新了電路板上的圖像(從Ubuntu Raring到Ubuntu Saucy),代碼現在工作正常。正如@ user3125280所示,這實際上是一個stdlibC++問題。