std:未来超时太早了,替代方案



我有以下C++11代码:

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(),我就会得到一个"你好!"输出。

然而,在我的带有gcc版本4.7.3 20130328(预发布版)的ARM板上(crosstool NG linaro-1.13.1-4.7-2013.044-20130415-linaro gcc 2013.04),我立即得到了输出,没有明显的延迟(即,它甚至不等待第一秒),而且它只是一直打印"Hello!",直到myfunction()完成。

根据http://en.cppreference.com/w/cpp/thread/future/wait_for只有当并且只有当超时已经过期时,我才应该获得超时状态。

我怀疑这可能是由于GCC中的"定时等待函数不返回future_status::deferred"(参考问题C++11 future_status::deferred不工作)。然而myfunction()运行,所以最终它不应该一直返回"Timeout",不是吗?

有人在ARM平台上对future::wait_fo有任何经验吗?或者有人能对这个问题有所了解吗?

我更新了板上的图像(从UbuntuRaring到UbuntuSaucy),代码现在运行良好。正如@user3125280所指出的,这实际上是一个stdlibc++问题。

最新更新