2014-01-19 28 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++问题。