除非您致电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)
}
我没有当前的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中的实施存在问题?