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 句柄

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

于 2013-01-10T21:15:42.420 回答
3

我用 boost asio 写了一个 ThreadPool 类。它可以工作,并且足够干净清晰,易于理解。带有 boost asio 的 ThreadPool

于 2014-10-22T15:09:28.633 回答
3

我看不出有任何理由不这样做。作为一个好处,您可以使用构建在 boost::asio 之上的截止时间计时器之类的东西。

于 2013-01-10T19:30:29.780 回答