私は主な機能ではなく、スレッドを使用する私のコードに関数を持っています。プログラムが実行されると、何千回も呼ばれます。これは、このC++ 11関数は、結合されたスレッドがまだ終了していないときに戻ることができますか?
void my_function(vector<string> input, vector<string> &results)
{
results.clear();
results.resize(input.size());
vector<thread> th;
th.resize(input.size());
for(int i=0; i<input.size();i++)
{
th[i]=thread(fold, input,ref(results), i);
}
for(auto & t : th)
{
t.join();
}
}
fold
機能コピーoutput
のエントリからi input
のエントリi
から導出される文字列、のように見えます。 my_functionがすべてのスレッドが終了したときに、スレッドが終了することを確認したい。私はこの質問をする理由は、この関数を並列化した後、私は巨大なメモリリークを起こし、スレッドがリソースを保持していると疑うことです。
はい返すためには、すべてのスレッド関数が返されている必要があります。 'my_function'が返る前にすべての' join'コールが返されなければなりません。 'std :: thread'オブジェクトに関連するすべてのリソースは、対応する' join'呼び出しによって、またはオブジェクトが破壊されたときに( 'my_function'から返ってくる一部として)解放されます。 ***しかしながら***スレッド関数が解放しないリソースを明示的に割り当てる場合、それらは自動的にはクリーンアップされません。 –
@Rezaまた、 'results'を並列アクセスから保護する必要があります。この問題を回避するには、結果のサイズ変更も行う必要があります。各スレッドは番号を知っている必要があります。したがって、割り当てられた変数だけが変更されます。各スレッドが1つの結果文字列を生成すると仮定します。 – Arkady
MCVE折り目は何をするのですか? – SergeyA