2012-10-08 13 views
9

Wydaje się, że jeśli zadzwonić std::asyncstd::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

+0

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

Odpowiedz

12

jest to problem z VS2012. Nie jest to jedyny problem - ich implementacja biblioteki wątków C++ 11 zawiera kilka błędów. Napisałem o kilku on my blog.

+0

Dzięki! Wiedziałem, że wsparcie dla VS11 C++ 11 STL nie było takie wspaniałe, ale nie sądziłem, że byłoby całkowicie bezużyteczne. Wszelkie komentarze dotyczące implementacji tych funkcji przez boosta (oczywiście nie asynchroniczne lub rzeczy, których jeszcze nie zaimplementowały)? –

+0

Implementacja doładowania jest ogólnie dobra, w przypadku funkcji, które są zaimplementowane. Jest kilka błędów, ale pracujemy nad nimi, a Vicente pracuje nad brakującymi funkcjami C++ 11. –

+0

@AnthonyWilliams Dzięki za wsparcie doładowania. Jest to coś, na co można polegać w tym celu. – Ghita

Powiązane problemy