Es scheint, dass, wenn Sie std::async
ein std::future
nennen wird nie zu einem anderen Staat als future_status::deferred
eingestellt werden, es sei denn Sie get
oder wait
über die Zukunft nennen. wait_for
& wait_until
wird weiterhin nicht blockieren und future_status::deferred
zurückgeben, auch wenn die Aufgabe bereits ausgeführt wurde und das Ergebnis gespeichert.std :: Zukunft verschoben noch bei der Verwendung von std :: packaged_task (VS11)
Hier ist ein Beispiel:
#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)
}
ich, nicht den aktuellen C++ 11-Standard, aber die Standard-Entwurf in 30.6.9 sagt, dass, wenn ein packaged_task
es sollte in der das Ergebnis ausgeführt wird speichern Zukunftsgemeinschaftsstatus. Es ist nicht sehr klar, ob das beinhaltet, das erwartete wait_until
/wait_for
Verhalten einzustellen oder nicht. zuvor Probleme mit VS11 Verhalten in diesem Bereich in Bezug auf async
Anrufe
Zusätzlich scheint es, wie andere Compiler Probleme in diesem Bereich hat: C++ 11 future_status::deferred not working
Jeder, der den Standard kennen kann besser: Ist das erwartete Verhalten oder gibt es ein Problem mit der Implementierung in VS11?
Updates: Ich vermisste irgendwie den Bericht für diese: http://connect.microsoft.com/VisualStudio/feedback/details/761829/c-11-unexpected-behavior-for-std-future-wait-for-and-std-packaged-task
Der gleiche verzögerte Status wird leider durch Verwendung von VS 11 - Update 1 erhalten, wenn die Zukunft aus dem Versprechen erhalten wird (es funktioniert mit Async). Das Problem wurde ihnen vor einiger Zeit gemeldet, funktioniert aber immer noch nicht. Es vereitelt praktisch den Zweck, in vielen Fällen std :: future zu verwenden. Funktioniert mit mindestens 1,51 Boost. – Ghita