私は次のようにstd::future::get()
を呼び出すことによって結果を得るために、私の機能vector<int> identify
と別のループを実行するためにstd::future
のstd::vector
を定義するためのforループを作成しました:std :: future :: get()が呼び出された後にスレッドが実際に起動しますか?
for (int i = 0; i < NUM_THREADS; ++i) {
VecString::const_iterator first = dirList.begin() + i*share;
VecString::const_iterator last = i == NUM_THREADS - 1 ? dirList.end() : dirList.begin() + (i + 1)*share;
VecString job(first, last);
futures[i] = async(launch::async, [=]() -> VecInt {
return identify(i, job, make_tuple(bIDList, wIDList, pIDList, descriptor), testingDir, binaryMode, logFile, logFile2);
});
}
int correct = 0;
int numImages = 0;
for(int i = 0; i != NUM_THREADS; ++i) {
VecInt ret = futures[i].get();
correct += ret[0];
numImages += ret[1];
}
ジョブは、いくつかの画像を処理することであり、私は仕事を分割各スレッド間でほぼ等しくなります。私はまた結果に由来するスレッドを示すためにstd::cout
を関数に埋め込みます。
最初のスレッドが処理を終えた後、他のスレッドも処理を完了し、ループが結果を出力することが期待されます。しかし、最初のスレッドが終了した後も、他のスレッドは引き続き動作します。関数が大きなイメージを処理するときに遅延があるため、結果を出力するだけでなく、実際に作業すると思います。これはスレッドが本当にいつ始まるのか不思議です。
私は、各スレッドが初期化後すぐに起動することをドキュメントから知っていますが、どのように私の観察を説明することができますか?大変ありがとうございます。どんな助けでも大変ありがとうございます。
[MCVE] – Jonas
を投稿してください私は、明確にするために私のコードスニペットを追加しました。 –
私の最初の考えは、あなたのcoutがバッファーに入ってきて、直接印刷されないということです。 起動時に確実にスレッドを使い慣れていない時間/クロックを印刷してみてください。 – turoni