Sembra che a meno che non si chiama std::async
un std::future
potrà mai essere impostato su qualsiasi altro stato che future_status::deferred
a meno che non si chiama get
o wait
sul futuro. wait_for
& wait_until
continuerà a non bloccare e restituire future_status::deferred
anche se l'attività è già stata eseguita e memorizzato il risultato.std :: futuro ancora differita quando si utilizza std :: packaged_task (VS11)
Ecco un esempio:
#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)
}
Non ho l'attuale standard di C++ 11, ma il progetto di norma in 30.6.9 dice che quando un packaged_task
viene eseguito deve memorizzare il risultato nel stato condiviso del futuro. Non è molto chiaro se questo include l'impostazione del comportamento wait_until
/wait_for
previsto o meno.
precedenza c'erano problemi con il comportamento VS11 in questo settore rispetto al async
chiamate: http://social.msdn.microsoft.com/Forums/hu/parallelcppnative/thread/4394f2c1-0404-40df-869b-f4fc36fc035c
Inoltre sembra che altri compilatori hanno problemi in questa area: C++ 11 future_status::deferred not working
Chiunque può conoscere lo standard meglio: Questo comportamento è previsto o c'è un problema con l'implementazione in VS11?
Aggiornamenti: I riesce a sbagliare anche il rapporto per questo: http://connect.microsoft.com/VisualStudio/feedback/details/761829/c-11-unexpected-behavior-for-std-future-wait-for-and-std-packaged-task
Lo stesso stato posticipato si ottiene sfortunatamente utilizzando VS 11 - Update 1, quando il futuro viene ottenuto da promessa (funziona con async). Il problema è stato segnalato a loro qualche tempo fa, ma non funziona ancora. In pratica, sconfigge praticamente lo scopo dell'uso di std :: future in molti casi. Funziona con boost 1.51 almeno. – Ghita