2016-04-19 1 views
5

У меня есть подобный код:Можно ли вернуться из функции до того, как все std :: фьючерсы закончены?

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

Может ли я вернуться из функции, когда есть незаконченные асинхронные вызовы? Меня интересует только одно ненулевое значение. Должен ли я ждать завершения всех асинхронных вызовов? Безопасен ли этот код?

+0

Что означает «безопасный»? –

+0

Я имею в виду крах, неопределенное поведение или что-то в этом роде. Я просто хочу получить первое ненулевое значение и игнорировать другие. Я хочу, чтобы моя программа всегда вела себя так. Другими словами - существуют ли какие-либо опасности в этом коде? Я не знаю, что произойдет, когда другие асинхронные вызовы будут завершены, а 'vector' фьючерсов не будет существовать. – peter55555

+6

Ваша программа не имеет неопределенного поведения. Но он может заблокировать выполнение всех асинхронных операций перед возвратом. –

ответ

7

Деструктор std::future (при инициализации от вызова до std::async) блокируется до завершения задачи async. (See here)

Так что ваша функция return заявление не будет завершено, пока все задачи не будут завершены.