2012-10-08 17 views
9

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

+0

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

risposta

12

Questo è un problema con VS2012. Non è l'unico problema: la loro implementazione della libreria di thread C++ 11 ha diversi bug. Ho scritto su alcuni on my blog.

+0

Grazie! Sapevo che il supporto ST11 di C++ 11 VS11 non era eccezionale, ma non pensavo che sarebbe stato completamente inutilizzabile. Qualche commento sull'implementazione di queste funzionalità da parte di boost (ovviamente non asincrona o cose che non hanno ancora implementato)? –

+0

L'implementazione boost è generalmente valida, per le funzionalità implementate. Ci sono alcuni bug, ma ci stiamo lavorando e Vicente sta lavorando sulle funzionalità mancanti di C++ 11. –

+0

@AnthonyWilliams Grazie per il supporto boost. È qualcosa su cui ci si può basare per questo – Ghita

Problemi correlati