std :: future по-прежнему откладывается при использовании std :: packaged_task (VS11)

Кажется, что если вы не позвоните 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

9

Решение

Это проблема с VS2012. Это не единственная проблема — их реализация библиотеки потоков C ++ 11 имеет несколько ошибок. Я написал о нескольких в моем блоге.

12

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]