2016-07-01 8 views
1

私はいくつかの即時作業(再割り当て)といくつかのバックグラウンド作業(古いデータの移動)を行う必要がある機能を持っています。asyncを使用してスレッドを切断し、将来の範囲を外しても安全ですか?

auto fof = std::async(std::launch::async, &cont2::move_data, this, old_data, old_size); 

細かい動作しているようだが、それは私がのstdを使用::通常、非同期(async)何かせずに、戻り値を保持するために聞かせて、代わりに同じスレッド上でタスクを実行しようとしませんので、私は疑わしいです。

答えて

2

戻り値std::futureが有効範囲外になると、デストラクタは非同期操作が完了するまでスレッドの実行を停止します。

つまり、結果を返さないと、同期して動作します。 std::asyncの呼び出しは一時的に返されます。これは、すぐに呼び出されたデストラクタを呼び出し、処理が完了するまでブロックします。同様に、値にバインドすると作業は継続されますが、バインドされた値がスコープの終わりに達すると一時停止します。例えば

{ 
    // bind to a value 
    auto fof = std::async(std::launch_async, 
          &cont2::move_data, this, old_data, old_size); 
    // do work 
} // at this point, execution will halt until cont2::move_data finishes 

http://en.cppreference.com/w/cpp/thread/asyncを参照してください。

+0

この動作は 'future'オブジェクトでは異常です。 'async'によって返される' future'sにのみ適用されます。神はC++が意味をなさないことを禁じているから... –

関連する問題