从线程池调用时,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 运行函数

Boost::ASIO - 如何专用 2 个线程来处理接收和发送消息

boost::asio 在线程中启动不同的服务?

多线程和Boost::Asio

Boost.Asio 是不是可以使用单独的线程进行读写?

使用 boost 创建线程池