10

このブログでは、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();
    }
}

Boost :: asioは、私が知る限り、主にネットワークIO用に作られています。ただし、主に汎用機能に使用したいと思います。並行性の問題は、を使用して解決されasio::io_service::strandます。

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

4

3 に答える 3

6

Boost.Asioは、ネットワークプログラミング専用ではありません。リファレンスドキュメントを参照してください。それはのようなもののための広範なサポートを持っています

  • 時間ベースの操作(deadline_timer
  • 信号処理
  • posixストリームやWindowsハンドルなどのプラットフォーム固有の操作

いくつかのアプリケーションでも他の目的に使用しました。1つの例は、アプリケーションに非同期インターフェイスを提供しながら、長時間実行される可能性のあるブロッキングデータベース操作を処理するスレッドプールです。Boost.Asioは本当に非常に強力なライブラリです。提案する汎用スレッドプールに使用すると、問題なく機能します。

于 2013-01-10T21:15:42.420 に答える
3

このようにしない理由は見当たらない。利点として、boost::asioの上に構築された期限タイマーのようなものを使用できます。

于 2013-01-10T19:30:29.780 に答える
3

Boostasioを使用してThreadPoolクラスを作成しました。それは機能し、簡単に理解できるほどクリーンでクリアです。ブーストasioを使用したThreadPool

于 2014-10-22T15:09:28.633 に答える