将boost :: asio线程池用于通用任务

时间:2013-01-10 19:23:03

标签: c++ multithreading c++11 threadpool boost-asio

this blog中,我找到了一个关于如何使用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?与其他线程池实现相比,是否存在明显的性能损失?如果是这样,那么还有更好的实现吗?

3 个答案:

答案 0 :(得分:6)

Boost.Asio不仅仅用于网络编程,请参阅reference documentation。它对

等内容提供了广泛的支持
  • 基于时间的操作(deadline_timer
  • 信号处理
  • 特定于平台的操作,例如posix流和Windows句柄

我也在几个应用程序中将它用于其他目的。一个示例是线程池,用于为应用程序提供异步接口,同时为可能长时间运行的阻塞数据库操作提供服务。 Boost.Asio确实是一个非常强大的库。如你所说,将它用于通用线程池可以正常工作。

答案 1 :(得分:3)

我认为没有任何理由不以这种方式做事。作为一个好处,你可以使用建立在boost :: asio。

之上的截止时间计时器

答案 2 :(得分:2)

我用boost asio写了一个ThreadPool类。它的工作原理很干净,清晰,易于理解。 ThreadPool with boost asio