似乎除非你调用std::async
a ,否则std::future
永远不会设置为任何其他状态,future_status::deferred
除非你调用get
or 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 中的标准草案说,当 apackaged_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-打包任务