最悪のシナリオに達したときに比較的高価な計算を行うプログラムを書いています。私はスレッドを動的に作成しようとしましたが、これはほとんどの場合に機能することが証明されていますが、最悪のシナリオが発生した場合、実行速度はこれらの計算を完了するために割り当てられた時間を超えています。これらのスレッドの破壊。これは、スレッドを動的に作成して破棄するのではなく、実行前にスレッドを作成し、動的に作成する代わりに計算を実行する前にスレッドを待機させるという、過去に使用したアイデアに私を導きました。
通常、私はこれを行うことについて二度考えることはありませんが、システムの初期化中に大量のスレッドを作成することになるため、これがシステムのパフォーマンスにどのように影響するかが心配です. これはある疑問を投げかけました: ある条件で待機しているスレッドは、システムにどのような影響を与えるのでしょうか? プログラムの初期化中にスレッドを作成し、計算を実行する必要があるときにのみ通知することは、この問題にアプローチする正しい方法ですか、それとも私が知らないより良い解決策が存在しますか? これを行うためにスレッドプールを使用することも考えました。この状況にはスレッドプールが最適でしょうか?
この質問への回答を改善するために役立つと思われる情報:
-- プログラムをマルチスレッド化するために、boost ライブラリ (バージョン 1_54_0) を使用しています。
-- Windows 7 と Visual Studio を使用しています。
-- プログラムの初期化時にスレッドを作成すると、200 ~ 1000 のスレッドが作成されます (この数は #define として事前に決定されており、計算を行う必要があるたびにすべてのスレッドを使用するとは限りません)。
-- 必要なスレッドの数は、この計算を実行するたびに異なります。これは、計算が実行されるたびに変化する受信入力の数に依存しますが、最大値を超えることはありません (最大数はコンパイル時に #define として決定されます)。
--私が使用しているコンピューターには 32 コアがあります。
この質問が標準に達していない場合は申し訳ありません。私は新しいスタック オーバーフロー ユーザーなので、状況と問題をより適切に説明するにはどうすればよいか、さらに情報を求めて批評してください。よろしくお願いします。
アップデート
ソース コードは次のとおりです (一部の変数は、会社の利用規約に従って名前が変更されています)。
for(int i = curBlob.boundingBoxStartY; i < curBlob.boundingBoxStartY + curBlob.boundingBoxHeight; ++i)
{
for(int j = curBlob.boundingBoxStartX; j < curBlob.boundingBoxStartX + curBlob.boundingBoxWidth; ++j)
{
for(int k = 0; k < NUM_FILTERS; ++k)
{
if((int)arrayOfBinaryValues[channel][k].at<uchar>(i,j) == 1)
{
for(int p = 0; p < NUM_FILTERS; ++p)
{
if(p != k)
{
if((curBlob.boundingBoxStartX + 1 < (curBlob.boundingBoxStartX + curBlob.boundingBoxWidth)) && ((int)arrayOfBinaryValues[channel][k].at<uchar>(i + 1,j) == 1))
++count;
if((curBlob.boundingBoxStartY + 1 < (curBlob.boundingBoxStartY + curBlob.boundingBoxHeight)) && ((int)arrayOfBinaryValues[channel][k].at<uchar>(i,j + 1) == 1))
++count;
}
}
}
}
}
}
提供されるソース コードは、厳密にアルゴリズムの複雑さを示すためのものです。