2016-04-19 15 views
5

Ich habe Code wie folgt aus:Ist es sicher, aus der Funktion zurückzukehren, bevor alle std :: futures beendet sind?

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; 
    } 
} 

Kann ich aus der Funktion zurück, wenn es unvollendet Asynchron-Anrufe? Ich interessiere mich nur für einen Wert ungleich null. Sollte ich warten, bis alle asynchronen Anrufe beendet sind? Ist dieser Code sicher?

+0

Was bedeutet "sicher"? –

+0

Ich meine, Absturz, undefiniertes Verhalten oder so etwas. Ich möchte nur den ersten Wert ungleich null erhalten und andere ignorieren. Ich möchte, dass sich mein Programm immer so verhält. Mit anderen Worten: Gibt es in diesem Code irgendwelche Gefahren? Ich weiß nicht, was passieren wird, wenn andere Async-Aufrufe beendet werden und "Vektor" von Futures nicht existieren wird. – peter55555

+6

Ihr Programm hat kein undefiniertes Verhalten. Es kann jedoch bei der Beendigung aller asynchronen Vorgänge blockieren, bevor es zurückkehrt. –

Antwort

7

Der Destruktor von std::future (bei Initialisierung von einem Aufruf an std::async) blockiert, bis die asynchrone Task abgeschlossen ist. (See here)

So Ihre Funktion return Anweisung wird nicht abgeschlossen, bis alle Aufgaben abgeschlossen sind.