在这篇博客中,我发现了一个关于如何使用 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,创建这样的线程池是个好主意吗?与其他线程池实现相比,是否存在明显的性能损失?如果是这样,是否有更好的实现也同样整洁?