当从线程池调用时,boost的io_service是否共享请求的线程?

时间:2013-11-14 12:05:17

标签: c++ multithreading boost boost-asio

我的问题是关于提升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;
}

它会动态共享请求的线程,还是只为连接组提供一个线程? 感谢。

1 个答案:

答案 0 :(得分:2)

asio::io_service有一个共享事件队列。这些事件由当前调用io_service :: run()的线程处理。所以,是的,可能会从不同的线程调用处理程序。

我不建议您为服务器运行16个线程,因为它会减慢速度(因为上下文切换和boost::asio bottleneck)。如果你真的需要这么多线程,那么更喜欢使用“io_service per thread”这个习惯用法。