C++ が製品コード (boost など) で使用するスレッド プールの適切なオープン ソース実装は何ですか?
独自のサンプル コードまたはサンプル コードの使用方法へのリンクを提供してください。
C++ が製品コード (boost など) で使用するスレッド プールの適切なオープン ソース実装は何ですか?
独自のサンプル コードまたはサンプル コードの使用方法へのリンクを提供してください。
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を使用して自分でスレッド プールを実装することは難しくありません。タスクによっては、標準テンプレート ライブラリのコンテナーではなく、キューにロックフリーコンテナーを使用したい場合があります。たとえば、ライブラリのコンテナです。fifo
lock free
幸運を!
ここに小さな例を書きました。基本的に、次のコードを実装する必要があります。
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プールで使用可能なスレッドの数を制御してから、プール内のスレッドの1つによって実行されるio_serviceにタスクを「ポスト」することができます。そのような各タスクはファンクターでなければなりません(私は信じています)。
現在、ここに例を示すことはできませんが、io_serviceプールに関するasioのドキュメントでは、これを行う方法の概要を説明しています。
以下は、スレッド プール (Boost 上に構築) を使用した単純なヘッダーのみのタスク キューです。
TaskQueue プロジェクト ページには、使用方法を示すサンプル アプリケーションが含まれています。
ここでは、 ffead-cppフレームワークを使用した実装例について説明します。直接の優先度ベースの実装とスケジュールされたスレッドプールの実装を提供します。見てみな...