22

さまざまなユースケースを理解しようとしています。と 2 つのスレッドの使用の違い。 これは私が読んだ素晴らしいチュートリアルで、説明していますboost::thread_group

ここに私が使用しているコードがあります:

boost::threadpool::pool s_ThreadPool(GetCoreCount());

CFilterTask task(pFilter,  // filter to run
    boost::bind(&CFilterManagerThread::OnCompleteTask, this, _1, _2) // OnComplete sync callback          // _1 will be filter name  // _2 will be error code
                );

// schedule the new task - runs on the threadpool
s_ThreadPool.schedule(task);

これはデストラクタです:

s_ThreadPool.wait(0);

説明していただけますか?

4

1 に答える 1

47

boost::thread_groupスレッドのコレクションに対してスレッド管理操作を実行するための便利なクラスです。たとえば、 を反復処理して各スレッドでstd::vector<boost::thread>呼び出す代わりに、は便利なメンバー関数を提供します。join()thread_groupjoin_all()

ではboost::thread、 によって管理されているかどうかに関係なくboost::thread_group、スレッドの寿命はスレッドが実行している作業に依存することがよくあります。たとえば、計算コストの高い計算を実行するためにスレッドが作成された場合、そのスレッドは結果が計算された後に終了できます。作業の存続期間が短い場合、スレッドの作成と破棄のオーバーヘッドがパフォーマンスに影響を与える可能性があります。

一方、スレッドプールは、多数のスレッドが多数のタスク/作業を処理するパターンです。スレッドの存続期間は、タスクの存続期間とは直接関係ありません。前の例を続けると、アプリケーションは計算コストの高い計算をスレッド プール内で実行するようにスケジュールします。作業はスレッドプール内でキューに入れられ、スレッドプールのスレッドの 1 つが選択されて作業が実行されます。計算が完了すると、スレッドは、スレッドプールでさらに作業がスケジュールされるのを待機する状態に戻ります。

このスレッドプールの例に示すようにスレッドプールを実装しboost::thread_groupて、スレッドの有効期間を管理しboost::asio::io_service、タスク/作業のディスパッチを行うことができます。

于 2013-05-21T20:36:51.007 に答える