私は並列で実行されるタスクを受け取るC++でスレッドプールクラスを作成しています。可能であれば、すべてのコアがビジー状態になるようにしたいが、時には同期目的でブロックされているため、あるスレッドはアイドル状態になることがあります。これが起こると、新しいスレッドを開始したいので、CPUコアと同じくらい多くのスレッドが常に起動するようにします。この目的のためには、特定のスレッドが起きているか眠っている(ブロックされている)かどうかを調べる方法が必要です。これをどのように見つけることができますか?スレッドがブロックされているかどうかを調べる方法はありますか?
私はC++ 11標準ライブラリを使用するか、移植性を高めることをお勧めします。しかし、必要ならばWinAPIも使用します。私はWindows 7上でVisual Studio 2012を使用していますが、実際には、これを行うための移植可能な方法が必要です。
好ましくは、このスレッドプールが100件のスレッドがそれを呼び出しまで
MyThreadPool pool;
for (int i = 0; i < 100; ++i)
pool.addTask(&block_until_this_function_has_been_called_a_hundred_times);
pool.join(); // waits until all tasks have been dispatched.
機能block_until_this_function_has_been_called_a_hundred_times()
ブロック状のケースをマスターすることができなければなりません。この時点で、すべてのスレッドは実行を継続する必要があります。スレッドプールの要件の1つは、プール内のスレッド数が少なすぎるためにデッドロックしないことです。
当時のCPU使用量を測定できました。しかし、あなたの閉塞が本当にかなり長い場合(ロックのラッパーを持っている場合は、「どれくらい長くスリープするか」という統計情報を保持することができます)、スレッドがブロックされるよりも新しいスレッドを開始するにはもっと時間がかかるでしょう。私はこれを行う標準的な方法を知らない。 –
ブロックされているとはどういう意味ですか?あなたのスレッドの一部がブロックされているためにアイドル状態になっている場合、別のスレッドのヘルプを開始すると、既存のスレッドと同じリソースを待ってアイドル状態になりませんか? @MatsPeterssonによれば、スレッドのアイドル時間を測定できると言われていますが、おそらくリソースのスループットを測定してスレッドを可能な限りビジーに保つ必要があります。 – dwxw
なぜ迷惑でしょうか?十分な数の余分なスレッドをプールに確保するだけです。 –