2013-01-10 36 views
9

this blog私は、boost :: asioを使用して簡単なスレッドプールを作成する方法について非常にきちんとした例を見つけました。汎用タスクのためのboost :: asioスレッドプールの使用

#include <thread> 
#include <functional> 
#include <boost/asio.hpp> 

int main (int argc, char* argv[]) { 
    asio::io_service io_service; 
    asio::io_service::work work(io_service); 

    std::vector<std::thread> threadPool; 

    for(size_t t = 0; t < std::thread::hardware_concurrency(); t++){ 
     threadPool.push_back(thread(std::bind(&asio::io_service::run, &io_service))); 
    } 

    io_service.post(std::bind(an_expensive_calculation, 42)); 
    io_service.post(std::bind(a_long_running_task, 123)); 

    //Do some things with the main thread 

    io_service.stop(); 
    for(std::thread& t : threadPool) { 
     t.join(); 
    } 
} 

ブースト:: ASIOは、主にネットワークIOのために作られた、私の知る限りでは、次のとおりです。私は基本的にはこのようにそれを使用したいです。しかし、私は主に汎用関数に使用したいと思っています。並行性の問題は、asio::io_service::strandを使用して解決されます。

私の質問:私のプログラムがネットワークIOを使用しない場合でも、このようなスレッドプールを作成することをお勧めしますか?他のスレッドプール実装と比較して明らかなパフォーマンス低下はありますか?もしそうなら、より良い実装もありますか?

+0

boost :: thread boost boost :: thread_groupを使用すると、スレッドをグループ化することができます – StereoMatching

答えて

6

Boost.Asioは、ネットワークプログラミングだけではありません。reference documentationを参照してください。それは

  • 時間ベースの操作(deadline_timer
  • なPOSIXのストリームやWindowsなど
  • プラットフォーム固有の操作を扱う信号は、私は他のためにそれを使用しました

ハンドルのようなものを幅広くサポートしていいくつかのアプリケーションでも同様です。 1つの例は、潜在的に長時間実行されているブロッキングデータベース操作にサービスを提供し、アプリケーション用の非同期インターフェースを提供するスレッドプールです。 Boost.Asioは本当に非常に強力なライブラリです。あなたが提案した汎用スレッドプールのためにそれを使用すると、うまく動作することができます。

3

このようなことをしない理由はありません。利点として、boost :: asioの上に構築されたデッドラインタイマーのようなものを使うことができます。

2

私はboost asioでThreadPoolクラスを作成しました。それは動作しており、簡単に理解できるくらい明確な&です。 ThreadPool with boost asio

関連する問題