Кажется, что если вы не позвоните 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
поведение или нет.
Ранее были проблемы с поведением VS11 в этой области в отношении async
звонки: http://social.msdn.microsoft.com/Forums/hu/parallelcppnative/thread/4394f2c1-0404-40df-869b-f4fc36fc035c
Кроме того, похоже, что другие компиляторы имеют проблемы в этой области: C ++ 11 future_status :: deferred не работает
Любой, кто может знать стандарт лучше: это ожидаемое поведение или есть проблема с реализацией в VS11?
Обновления: я как-то пропустил отчет по этому поводу: http://connect.microsoft.com/VisualStudio/feedback/details/761829/c-11-unexpected-behavior-for-std-future-wait-for-and-std-packaged-task
Это проблема с VS2012. Это не единственная проблема — их реализация библиотеки потоков C ++ 11 имеет несколько ошибок. Я написал о нескольких в моем блоге.
Других решений пока нет …