2016-04-19 6 views
5

私はそのようなコードを持っているが:すべてのstd :: futuresが終了する前に関数から戻っても安全ですか?

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

私は未完成の非同期呼び出しがあるときに関数から戻ることはできますか?私は1つの非ゼロ値だけに興味があります。すべての非同期呼び出しが終了するまで待機する必要がありますか?このコードは安全ですか?

+0

「安全な」とはどういう意味ですか? –

+0

クラッシュ、未定義の動作などを意味します。私はちょうど最初のゼロ以外の値を取得し、他のものを無視したい。私は自分のプログラムが常にそのように振舞うようにしたい。つまり、このコードには何らかの危険がありますか? 他の非同期呼び出しが終了し、先物の「ベクトル」が存在しないときに何が起きるのか分かりません。 – peter55555

+6

プログラムに未定義の動作がありません。しかし、それは戻る前にすべての非同期操作の完了をブロックする可能性があります。 –

答えて

7

非同期タスクが完了するまで、デストラクタstd::futurestd::asyncの呼び出しから初期化される)はブロックされます。 (See here

したがって、すべてのタスクが完了するまで、関数returnのステートメントは完了しません。

関連する問題