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

Kay*_*gle 9 c++ future packaged-task c++11 visual-studio-2012

似乎除非你打电话给std::async一个std::future遗嘱永远不会被设置为任何其他状态,future_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)
}
Run Code Online (Sandbox Code Playgroud)

我没有当前的C++ 11标准,但是30.6.9中的草案标准说当a 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-包装任务

Ant*_*ams 12

这是VS2012的一个问题.这不是唯一的问题---他们对C++ 11线程库的实现有几个bug.我在博客上写了几篇文章.

  • 微软让我对他们破碎的承诺感到非常难过.:'( (4认同)