並行して実行されるタスクを受け取るスレッド プール クラスを C++ で作成しています。可能であればすべてのコアをビジー状態にしたいのですが、同期のために一時的にブロックされるため、一部のスレッドがアイドル状態になることがあります。これが発生したら、CPU コアとほぼ同じ数のスレッドが常に起動するように、新しいスレッドを開始したいと思います。この目的のために、特定のスレッドが起動しているか、またはスリープ (ブロック) されているかを確認する方法が必要です。どうすればこれを見つけることができますか?
移植性のために C++11 標準ライブラリまたはブーストを使用することをお勧めします。しかし、必要に応じて WinAPI も使用します。私は Windows 7 で Visual Studio 2012 を使用しています。
できれば、このスレッドプールは次のようなケースをマスターできるはずです
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()
は 100 個のスレッドが呼び出すまでブロックします。この時点で、すべてのスレッドが引き続き実行されます。スレッドプールの要件の 1 つは、プール内のスレッド数が少なすぎるためにデッドロックしないようにすることです。