使用std :: packaged_task(VS11)时std :: future仍然延迟

时间:2012-10-08 03:10:41

标签: c++ c++11 visual-studio-2012 future packaged-task

除非您致电std::async,否则除非您致电std::futurefuture_status::deferred,否则get永远不会设置为wait以外的任何其他州。未来。 wait_for& wait_until将继续阻止并返回future_status::deferred,即使该任务已经运行并存储了结果。

以下是一个例子:

#include <future>

void main()
{
    auto func = []() { return 5; };
    auto asyncFuture = std::async(std::launch::async, func);
    auto status = asyncFuture.wait_for(std::chrono::seconds(0));   // timeout (1)

    auto deferredFuture = std::async(std::launch::deferred, func);
    status = deferredFuture.wait_for(std::chrono::seconds(0));     // deferred (2)

    std::packaged_task<int()> task(func);
    auto packagedTaskFuture = task.get_future();
    status = packagedTaskFuture.wait_for(std::chrono::seconds(0)); // deferred (2)

    task();

    status = packagedTaskFuture.wait_for(std::chrono::seconds(0)); // deferred (2)
    packagedTaskFuture.wait();
    status = packagedTaskFuture.wait_for(std::chrono::seconds(0)); // ready (0)
}

我没有当前的C ++ 11标准,但30.6.9中的草案标准表示当运行packaged_task时,它应该将结果存储在未来的共享状态中。这是否包括设置预期的wait_until / wait_for行为还不是很清楚。

此区域中存在与async来电相关的VS11行为问题:http://social.msdn.microsoft.com/Forums/hu/parallelcppnative/thread/4394f2c1-0404-40df-869b-f4fc36fc035c

此外,似乎其他编译器在这方面存在问题:C++ 11 future_status::deferred not working

任何可能更了解标准的人:这是预期的行为还是VS11中的实施存在问题?

更新:我以某种方式错过了报告:http://connect.microsoft.com/VisualStudio/feedback/details/761829/c-11-unexpected-behavior-for-std-future-wait-for-and-std-packaged-task

1 个答案:

答案 0 :(得分:12)

这是VS2012的问题。它不是唯一的问题---它们的C ++ 11线程库的实现有几个bug。我写了几篇on my blog