2012-03-16 17 views
17

Ho qualche domanda sul comportamento della funzione std::async con std::launch::async politica & std::future oggetto restituito da asincrono.il comportamento di std :: async con std :: launch :: politica async

Nel seguente codice, il thread principale attende il completamento di foo() sul thread creato dalla chiamata async.

#include <thread> 
#include <future> 
#include <iostream> 

void foo() 
{ 
    std::cout << "foo:begin" << std::endl; 
    std::this_thread::sleep_for(std::chrono::seconds(10)); 
    std::cout << "foo:done" << std::endl; 
} 

int main() 
{ 
    std::cout << "main:begin" << std::endl; 
    { 
    auto f = std::async(std::launch::async, foo); 
    // dtor f::~f blocks until completion of foo()... why?? 
    } 
    std::this_thread::sleep_for(std::chrono::seconds(2)); 
    std::cout << "main:done" << std::endl; 
} 

E so http://www.stdthread.co.uk/doc/headers/future/async.html dice

Il distruttore dell'ultimo oggetto futuro associato alla Stato asincrona del std :: restituita futuro deve bloccare fino a quando il futuro è pronto.

La mia domanda è:

  • Q1. Questo comportamento è conforme all'attuale standard C++?
  • Q2. Se la risposta di Q1 è sì, quali affermazioni lo dicono?
+0

La cosa sorprendente dello standard è che spesso una nota a piè di pagina cambia completamente un capitolo ... – orlp

risposta

16

Sì, questo è richiesto dallo standard C++. 30.6.8 [futures.async] paragrafo 5, proiettile finale:

- il completamento thread associato sincronizza con (1.10) il ritorno dalla prima funzione che rileva con successo lo stato pronto dello stato condiviso o con il ritorno dall'ultima funzione che rilascia lo stato condiviso, a seconda dell'evento che si verifica per primo.

Il distruttore del solo e unico std:future soddisfa questa condizione e quindi deve attendere il completamento del thread.

+1

Il codice OP NON funziona allo stesso modo per VS2012. Non blocca il distruttore 'futuro'. È una specie di bug, o la Microsoft ha semplicemente accettato la proposta di Sutter di non bloccare i dtors? –

+0

Microsoft ha scelto di implementare la proposta di Herb Sutter per non bloccare i distruttori. –

+0

Questo comportamento è un grosso problema, ma temo che sia troppo tardi per correggere lo standard. Microsoft che sceglie di implementare un comportamento non standard perché non è d'accordo con esso rende la vita difficile agli sviluppatori multipiattaforma. – cdmh

Problemi correlati