web-dev-qa-db-ja.com

boost :: threadpool :: pool vs.boost :: thread_group

さまざまなユースケースを理解しようとしています。 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);

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

19
Gilad

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

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

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

この threadpool の例に示すように、スレッドの存続時間を管理する_boost::thread_group_と、タスク/ワークディスパッチの_boost::asio::io_service_を使用してスレッドプールを実装できます。

42
Tanner Sansbury