web-dev-qa-db-ja.com

C ++スレッドプール

プロダクションコードで使用するC++のスレッドプールの優れたオープンソース実装(ブーストなど)

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

42
Amir Rachum

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の破棄は、すべてのスレッドが完了するのを待ちます。

21
Diego Sevilla

http://threadpool.sourceforge.net/ をご覧ください。

Boost.Thread を使用して、自分で thread pool を実装することは難しくありません。タスクによっては、 Standard Template Library のコンテナではなく、 lock-free コンテナを使用することもできます。たとえば、 lock free ライブラリのfifoコンテナ。

幸運を!

9
user405725

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

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();
7
tonicebrian

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

ここに例を挙げることはできませんが、io_serviceプールに関するasioのドキュメントに、これを行う方法の概要が記載されています。

3
Nim

以下は、Boostで構築されたスレッドプールを使用した単純なヘッダーのみのタスクキューです。 taskqueue.hpp

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

1
heathbar

ffead-cpp フレームワークを使用した実装例を説明します here 。スケジュールされたスレッドプールの実装だけでなく、優先度に基づいた直接的な実装も提供します。見てみな...

0
Sumeet

このライブラリ Boost.Threadでビルドします。 短いチュートリアル といくつかのサンプルコードがあります。これで目的の結果が得られない場合は、ベースラインとして使用できます。

この方法を使用する場合は、ブーストバージョンが1.37以上であることを確認してください。

0
Steve Townsend