我有以下的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的經驗,或者有人可以在這個問題上找到一些啓示嗎?
根據我的經驗,一些stdlibC++在x86上並沒有完全保持最新,我認爲它在ARM上更糟糕。你嘗試過boost :: future嗎?可能你*使用* std :: future超時太早。 – user3125280
不,還沒有。我試圖限制我們使用外部庫,尤其是如果標準庫中有(或者應該是)實現。 – Frankie
標準庫只是提升的一個端口 - 如果C++ 11版本不能在你的系統上運行,boost可能會有這種可能。無論如何他們返回什麼狀態? – user3125280