2016-04-19 36 views
5

Ho codice così:È sicuro tornare dalla funzione prima che tutti std :: future siano finiti?

int function() 
{ 
    std::vector<std::future<int>> futures; 
    for (const auto& elem : elements) 
    { 
     futures.push_back(std::async(&MyClass::foo, myClass, elem); 
    } 
    for (auto& f : futures) 
    { 
     const int x = f.get(); 
     if (x != 0) 
      return x; 
    } 
} 

Posso ritorno dalla funzione quando ci sono le chiamate asincrone non finiti? Mi interessa solo un valore diverso da zero. Devo aspettare fino a quando tutte le chiamate asincrone sono finite? Questo codice è sicuro?

+0

Che cosa significa "sicuro"? –

+0

Intendo crash, comportamento indefinito o qualcosa del genere. Voglio solo ottenere il valore non zero e ignorare gli altri. Voglio che il mio programma si comporti sempre così. In altre parole: ci sono pericoli in questo codice? Non so cosa succederà quando le altre chiamate asincrone saranno finite e il "vettore" dei futures non esisterà. – peter55555

+6

Il tuo programma non ha un comportamento indefinito. Ma potrebbe bloccare il completamento di tutte le operazioni asincrone prima di tornare. –

risposta

7

Il distruttore di(quando inizializzato da una chiamata a std::async) blocca fino al completamento dell'attività asincrona. (See here)

Quindi la tua funzione return non verrà completata fino al termine di tutte le attività.