从线程池调用时,boost 的 io_service 是不是共享请求线程?
Posted
技术标签:
【中文标题】从线程池调用时,boost 的 io_service 是不是共享请求线程?【英文标题】:Is boost's io_service share threads for request when called from thread pool?从线程池调用时,boost 的 io_service 是否共享请求线程? 【发布时间】:2013-11-14 12:05:16 【问题描述】:我的问题是关于 boost asio 的 io_service。 当我用那个方法调用它时:
int main()
try
boost::asio::io_service io_service;
Server server(io_service);
std::vector<boost::shared_ptr<boost::thread> > threads;
for (std::size_t i = 0; i < 16; ++i)
boost::shared_ptr<boost::thread> thread(new boost::thread(boost::bind(&boost::asio::io_service::run, &io_service)));
threads.push_back(thread);
for (std::size_t i = 0; i < threads.size(); ++i)
threads[i]->join();
catch (std::exception& e)
std::cerr << e.what() << std::endl;
return 0;
它会动态共享请求线程,还是只为连接组提供一个线程? 谢谢。
【问题讨论】:
您能否阐明当前上下文中的“请求”和“连接组”是什么? @IvanGrynko 我的意思是作为接收数据包的请求处理程序处理服务器逻辑。连接组意味着每个调度连接信号的反应器模式 1 个线程。 【参考方案1】:asio::io_service
有一个共享事件队列。这些事件由当前调用 io_service::run() 的线程处理。所以是的,处理程序可能会被不同的线程调用。
我不建议您为您的服务器运行 16 个线程,因为它会降低您的速度(因为上下文切换和 boost::asio bottleneck )。如果你真的需要这么多线程,那么更喜欢使用“每个线程的 io_service”习语。
【讨论】:
我只想为每个核心设计做线程,但我在旧计算机服务器上添加了 16 个线程进行调试测试以允许处理玩家。我不确定每个线程的 io 服务是否会很好,因为加入世界的人会在大同步数据包中运行,并且会完全阻塞 io_service。以上是关于从线程池调用时,boost 的 io_service 是不是共享请求线程?的主要内容,如果未能解决你的问题,请参考以下文章
从多个线程调用 boost::asio::io_service 运行函数