43

C++ が製品コード (boost など) で使用するスレッド プールの適切なオープン ソース実装は何ですか?

独自のサンプル コードまたはサンプル コードの使用方法へのリンクを提供してください。

4

7 に答える 7

22

Boost にはまだ受け入れられていないと思いますが、良い出発点です: threadpool。Web サイトからの使用例:

#include "threadpool.hpp"

using namespace boost::threadpool;

// Some example tasks
void first_task()
{
  ...
}

void second_task()
{
  ...
}

void third_task()
{
  ...
}

void execute_with_threadpool()
{
  // Create a thread pool.
  pool tp(2);

  // Add some tasks to the pool.
  tp.schedule(&first_task);
  tp.schedule(&second_task);
  tp.schedule(&third_task);

  // Leave this function and wait until all tasks are finished.
}

プールへの引数「2」は、スレッドの数を示します。この場合、tpすべてのスレッドが終了するまで待機します。

于 2010-10-21T13:58:06.710 に答える
10

http://threadpool.sourceforge.net/を参照してください。

Boost.Threadを使用して自分でスレッド プールを実装することは難しくありません。タスクによっては、標準テンプレート ライブラリのコンテナーではなく、キューにロックフリーコンテナーを使用したい場合があります。たとえば、ライブラリのコンテナです。fifolock free

幸運を!

于 2010-10-21T13:57:06.963 に答える
7

ここに小さな例を書きました。基本的に、次のコードを実装する必要があります。

asio::io_service io_service;
boost::thread_group threads;
auto_ptr<asio::io_service::work> work(new asio::io_service::work(io_service)); 

// Spawn enough worker threads
int cores_number = boost::thread::hardware_concurrency();
for (std::size_t i = 0; i < cores_number; ++i){
    threads.create_thread(boost::bind(&asio::io_service::run, &io_service));
}
// Post the tasks to the io_service
for(vector<string>::iterator it=tasks.begin();it!=tasks.end();it++){
   io_service.dispatch(/* YOUR operator()() here */);
}
work.reset();
于 2012-05-29T13:21:07.663 に答える
3

boost::asioのio_serviceでスレッドプールをエミュレートできると思います。io_serviceプールで使用可能なスレッドの数を制御してから、プール内のスレッドの1つによって実行されるio_serviceにタスクを「ポスト」することができます。そのような各タスクはファンクターでなければなりません(私は信じています)。

現在、ここに例を示すことはできませんが、io_serviceプールに関するasioのドキュメントでは、これを行う方法の概要を説明しています。

于 2010-10-21T14:49:23.480 に答える
1

以下は、スレッド プール (Boost 上に構築) を使用した単純なヘッダーのみのタスク キューです。

TaskQueue プロジェクト ページには、使用方法を示すサンプル アプリケーションが含まれています。

于 2013-03-14T00:19:32.070 に答える
0

ここでは、 ffead-cppフレームワークを使用した実装例について説明します。直接の優先度ベースの実装とスケジュールされたスレッドプールの実装を提供します。見てみな...

于 2011-05-28T06:05:09.033 に答える
0

このライブラリは Boost.Thread に基づいています。いくつかのサンプル コードを含む短いチュートリアルがあります。これで目的が達成されない場合は、ベースラインとして使用できます。

この方法を使用する場合は、Boost バージョン >= 1.37 を使用していることを確認してください。

于 2010-10-21T13:57:09.850 に答える