1

複数のスレッドで計算を行い、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か? どうすれば修正できますか?

どうもありがとうございました!

4

0 に答える 0