9

似乎除非你调用std::asynca ,否则std::future永远不会设置为任何其他状态,future_status::deferred除非你调用getor waitwait_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 中的标准草案说,当 apackaged_task运行时,它应该将结果存储在未来的共享状态中。目前还不清楚这是否包括设置预期wait_until/wait_for行为。

asyncVS11 在此区域的调用行为之前存在问题: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-打包任务

4

1 回答 1

12

这是 VS2012 的问题。这也不是唯一的问题 --- 他们对 C++11 线程库的实现有几个错误。我在我的博客上写了一些。

于 2012-10-08T06:50:42.177 回答