2012-10-08 12 views
9

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

Es gab: http://social.msdn.microsoft.com/Forums/hu/parallelcppnative/thread/4394f2c1-0404-40df-869b-f4fc36fc035c

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

+0

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

Antwort

12

Dies ist ein Problem mit VS2012. Es ist nicht das einzige Problem entweder --- ihre Implementierung der C++ 11 Thread-Bibliothek hat mehrere Fehler. Ich schrieb über ein paar on my blog.

+0

Danke! Ich wusste, dass die VS11 C++ 11 STL-Unterstützung nicht so toll war, aber ich dachte nicht, dass sie komplett unbrauchbar wäre. Irgendwelche Kommentare zur Boost-Implementierung dieser Features (offensichtlich nicht asynchron oder Dinge, die sie noch nicht implementiert haben)? –

+0

Die Boost-Implementierung ist im Allgemeinen für die implementierten Funktionen solide. Es gibt ein paar Bugs, aber wir arbeiten daran und Vicente arbeitet an den fehlenden C++ 11 Features. –

+0

@AnthonyWilliams Danke für die Unterstützung. Es ist etwas, auf das man sich verlassen kann – Ghita