6

並行して実行されるタスクを受け取るスレッド プール クラスを 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 つは、プール内のスレッド数が少なすぎるためにデッドロックしないようにすることです。

4

2 に答える 2

3

スレッドが「私はブロックされています」と言い、次に「私はもうブロックされていません」と言う機能をスレッドプールに追加します。すべての重要なブロック アクション (その意味については以下を参照) の前に、「ブロックされました」という合図を出し、その後で「ブロックされなくなりました」という合図を出します。

「重大なブロッキング アクション」とは何ですか? 確かに単純なミューテックス ロックではありません。ミューテックスは短時間だけ保持する必要があるため、ミューテックスをブロックすることは大したことではありません。私は次のようなことを意味します:

  • I/O の完了を待機しています
  • 別のプール タスクが完了するのを待機しています
  • 共有キューでデータを待機中

およびその他の同様のイベント。

于 2013-07-03T14:06:03.977 に答える