プロダクションコードで使用するC++のスレッドプールの優れたオープンソース実装(ブーストなど)
独自のサンプルコードまたはサンプルコードの使用方法へのリンクを提供してください。
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
の破棄は、すべてのスレッドが完了するのを待ちます。
http://threadpool.sourceforge.net/ をご覧ください。
Boost.Thread を使用して、自分で thread pool を実装することは難しくありません。タスクによっては、 Standard Template Library のコンテナではなく、 lock-free コンテナを使用することもできます。たとえば、 lock free
ライブラリのfifo
コンテナ。
幸運を!
私は小さな例を書きました 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();
Boost :: asioのio_serviceでスレッドプールをエミュレートできると思います。 io_serviceプールで使用可能なスレッドの数を制御できます。その後、io_serviceにタスクを「ポスト」できます。io_serviceは、プール内のスレッドの1つによって実行されます。そのようなタスクはそれぞれファンクターでなければなりません(私は信じています)。
ここに例を挙げることはできませんが、io_serviceプールに関するasioのドキュメントに、これを行う方法の概要が記載されています。
以下は、Boostで構築されたスレッドプールを使用した単純なヘッダーのみのタスクキューです。 taskqueue.hpp
TaskQueueプロジェクトページ には、 使用方法 を示すサンプルアプリケーションが含まれています。