对于带有单个接受器的线程boost :: asio服务器,我们是否需要每个线程有多个io_service

时间:2012-06-13 08:00:46

标签: c++ sockets boost boost-asio boost-thread

我对boost::asio的经验不足。我有一些非常基本的问题。

我是否需要在不同的io_service但只有一个socket下使用不同的thread和不同的acceptor来处理线程服务器中的客户端?

我相信我必须为新客户提供不同的套接字。但是如果所有线程都使用相同的io_service,它会是并行的吗?

我在asio部分经历了http://en.highscore.de/cpp/boost/index.html 这说我需要在不同的线程中使用不同的io_services来实现并行化。

如果我计划在new TCPsession每次出现新客户时创建一个acceptor.async_accept的Server类, 并且TCPSession ctor创建了一个io_service和一个thread并在自己的帖子中运行io_service.run()这是一个很好的设计吗?

但是在这个设计中我会加入所有这些线程吗?我需要io_service main,以便在获得新客户端之前不会终止吗?

1 个答案:

答案 0 :(得分:9)

在单个线程中运行的单io_service可以为项目中的所有asio对象提供服务。在这样的设计中,i / o仍然是“并行的”,因为它是非阻塞的,异步的;但由于io_service::run()正在一个单独的线程中运行,所以所有的完成处理程序将被逐个串行调用。

要在多个CPU上扩展网络模块,您可以使用以下两种方法之一:每个核心的线程,每个核心的io_service - 请参阅HTTPServer2 and HTTPServer3 examples

在任何情况下,创建一个主题或每个io_service TCPSession似乎都是一个不必要的开销 - 想想你有成千上万TCPSession个......的情况。 / p>