複数のスレッドで計算を行い、c++ future を使用して結果を返すプログラムを作成しています。これが私のコードの簡略化されたバージョンです。
int main()
{
int length = 64;
vector<std::future<float>> threads(length);
vector<float> results(length);
int blockLength = 8;
int blockCount = length/blockLength;
for(int j=0;j<blockCount;j++)
{
for(int i=0;i<blockLength;i++)
{
threads[i + j * blockLength] = std::async(func1,i*j);
}
for(int i=0;i<blockLength;i++)
{
results[i + j * blockLength] = threads[i].get();
}
}
func1 の定義は次のように簡略化されます。
float func1(int input)
{
//calculations...
return result;
}
上記のプログラムで、一度に 8 スレッドで 64 回の計算を実行して、プロセッサとメモリの使用率を同時に向上させたいと考えています。
プログラムはblockLength
、一度にスレッド数をポストし、計算結果が得られるまで待って、次のループに進むように考えられています。
プログラムは、8 回の場合は 8 スレッドなど、時間blockLength
ごとにスレッド数を通知します。blockCount
EXC_BAD_ACCESS
しかし、プログラムは機能していません。スレッドの最初のループが終了すると常に例外が発生しますblockLength
。さらに、各スレッドの計算時間は保証されていません。どのスレッドも長時間実行したり、すぐに終了したりする可能性があります。
スクリーンショットは次のとおりです。
上記のように、一部のスレッドが終了すると CPU 使用率が低下しますが、2 番目のループが開始されるとすぐに例外がスローされます。
の使い方のどこが悪いのか指摘していただけますfuture
か? どうすれば修正できますか?
どうもありがとうございました!