0

boost::threadis not-a-thread、aは、渡されたものが呼び出さnew threadれたときに作成され、スレッドは戻ったときに終了します。ftorftor

スレッドプールを使用して、スレッドの作成と破棄のコストを最小限に抑えます。ただし、スレッドプール内の各スレッドは、指定されたftorが戻ったときにも破棄されます。

では、スレッドプールの構築の背後にある基本的な概念は何ですか?そのスレッドにftorsを割り当てることができる永続的なスレッドはありますか?

4

2 に答える 2

1

スレッドプールは、すでに実行されており、すべて同じ関数を実行しているスレッドの集まりです。この関数は基本的にキューで待機するだけで、キューに「関数」がある場合はそれを抽出して実行します。

擬似コード:

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つのスレッドがあり、すべて最初は何かが「キュー」に入れられるのを待っています。キューに何かがある場合、それを抽出し、関数として呼び出します。

これはおそらく、スレッドプールを実装する最も簡単な方法です。

于 2012-07-27T07:24:53.687 に答える
1

@Joachimが投稿したものに加えて:

このようなシステム (および私がよく使用するシステム) をフロー制御する 1 つの方法は、タスクの「プール キュー」(ブロッキング プロデューサー/コンシューマー キュー) を使用することです。 . タスクを発行するスレッドは、最初にプールからタスクを取得する必要があり、タスクは完了処理後にプールに返されます。これにより、システム内のタスクの数が制限され、プールが空になった場合、要求スレッドは、いくつかの「使用済み」タスクが戻ってくるまで、空のプールでブロックされて待機する必要があります。

これはうまく機能し、フロー制御を提供し、メモリの暴走を防ぎ、継続的なタスクの作成/破棄を排除します。また、プールのキューの深さをタイマーで定期的に表示/書き込みするのも簡単なので、アプリがどれだけ「ビジー」であるかを確認できます (そしてリークを検出します:)。

編集:また、システム内の制限されたキューの必要性がなくなります。無制限のキューはより単純で、必要なシステム コールが少なくなる傾向があります。

于 2012-07-27T10:26:18.073 に答える