Wydaje się, że jeśli zadzwonić std::async
std::future
nigdy nie zostanie ustawiona na dowolnym innym stanie niż future_status::deferred
chyba nazwać get
lub wait
na przyszłość. wait_for
& wait_until
nadal nie będzie blokować ani zwracać future_status::deferred
, nawet jeśli zadanie już uruchomiło i zapisało wynik.std :: przyszłość ciągle odraczane przy użyciu std :: packaged_task (VS11)
Oto przykład:
#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)
}
nie mam aktualnego standardu C++ 11, ale projekt normy w 30.6.9 mówi, że gdy packaged_task
jest prowadzony powinien zapisać wynik w wspólny stan przyszłości. Nie jest jasne, czy obejmuje to ustawienie oczekiwanego zachowania wait_until
/wait_for
, czy też nie.
Były wcześniej problemy z zachowaniem VS11 w tej dziedzinie w stosunku do async
połączeń: http://social.msdn.microsoft.com/Forums/hu/parallelcppnative/thread/4394f2c1-0404-40df-869b-f4fc36fc035c
Dodatkowo wydaje się, że inne kompilatory mają problemy w tym obszarze: C++ 11 future_status::deferred not working
Każdy, kto może wiedzieć standard lepszy: Czy to oczekiwane zachowanie, czy też jest problem z implementacją VS11?
Aktualizacje: jakoś brakowało raport dla tego: http://connect.microsoft.com/VisualStudio/feedback/details/761829/c-11-unexpected-behavior-for-std-future-wait-for-and-std-packaged-task
Ten sam status odroczony jest uzyskiwany niestety przy użyciu VS 11 - Aktualizacja 1, kiedy przyszłość jest otrzymywana z obietnicy (działa z asynchronizacją). Problem został im zgłoszony jakiś czas temu, ale nadal nie działa. W wielu przypadkach praktycznie uniemożliwia zastosowanie std :: future. Działa przynajmniej z doładowaniem 1.51. – Ghita