boost::thread
is not-a-thread、aは、渡されたものが呼び出さnew thread
れたときに作成され、スレッドは戻ったときに終了します。ftor
ftor
スレッドプールを使用して、スレッドの作成と破棄のコストを最小限に抑えます。ただし、スレッドプール内の各スレッドは、指定されたftorが戻ったときにも破棄されます。
では、スレッドプールの構築の背後にある基本的な概念は何ですか?そのスレッドにftorsを割り当てることができる永続的なスレッドはありますか?
boost::thread
is not-a-thread、aは、渡されたものが呼び出さnew thread
れたときに作成され、スレッドは戻ったときに終了します。ftor
ftor
スレッドプールを使用して、スレッドの作成と破棄のコストを最小限に抑えます。ただし、スレッドプール内の各スレッドは、指定されたftorが戻ったときにも破棄されます。
では、スレッドプールの構築の背後にある基本的な概念は何ですか?そのスレッドにftorsを割り当てることができる永続的なスレッドはありますか?
スレッドプールは、すでに実行されており、すべて同じ関数を実行しているスレッドの集まりです。この関数は基本的にキューで待機するだけで、キューに「関数」がある場合はそれを抽出して実行します。
擬似コード:
void thread_pool_function()
{
while (true)
{
wait_for_signal_that_queue_is_not_empty();
function_to_call = queue.remove_top();
unklock_queue_semaphore();
function_to_call();
}
}
create_thread(thread_pool_function);
create_thread(thread_pool_function);
create_thread(thread_pool_function);
create_thread(thread_pool_function);
上記の「コード」には4つのスレッドがあり、すべて最初は何かが「キュー」に入れられるのを待っています。キューに何かがある場合、それを抽出し、関数として呼び出します。
これはおそらく、スレッドプールを実装する最も簡単な方法です。
@Joachimが投稿したものに加えて:
このようなシステム (および私がよく使用するシステム) をフロー制御する 1 つの方法は、タスクの「プール キュー」(ブロッキング プロデューサー/コンシューマー キュー) を使用することです。 . タスクを発行するスレッドは、最初にプールからタスクを取得する必要があり、タスクは完了処理後にプールに返されます。これにより、システム内のタスクの数が制限され、プールが空になった場合、要求スレッドは、いくつかの「使用済み」タスクが戻ってくるまで、空のプールでブロックされて待機する必要があります。
これはうまく機能し、フロー制御を提供し、メモリの暴走を防ぎ、継続的なタスクの作成/破棄を排除します。また、プールのキューの深さをタイマーで定期的に表示/書き込みするのも簡単なので、アプリがどれだけ「ビジー」であるかを確認できます (そしてリークを検出します:)。
編集:また、システム内の制限されたキューの必要性がなくなります。無制限のキューはより単純で、必要なシステム コールが少なくなる傾向があります。