我在boost::asio
方面没有太多经验。我有一些非常基本的问题。
我是否需要在不同的thread
下使用不同的io_service
和不同的socket
,但只有一个acceptor
,才能在线程服务器中处理客户端?
我相信我必须为新客户端使用不同的套接字。但是,如果所有线程都使用相同的io_service
它会是并行的吗?
我正在经历 asio 部分的 http://en.highscore.de/cpp/boost/index.html这说明我需要在不同的线程中使用不同的io_services才能实现并行化。
我是否打算创建一个服务器类,每次在 acceptor.async_accept
中出现新客户端时创建一个new TCPsession
TCPSession
CTOR 创建一个io_service
和一个thread
并在自己的线程中运行该io_service.run()
会是一个好的设计吗?
但是在这个设计中,我将在哪里加入所有这些线程? 我是否需要另一个io_service
main
以便它甚至在获得新客户端之前也不会终止?
在单个线程中运行的单个io_service
可以为项目中的所有 asio 对象提供服务。在这样的设计中,I/O 仍然是"并行"的,因为它是非阻塞的、异步的;但由于io_service::run()
在一个线程中运行,因此所有完成处理程序都将逐个串行调用。
若要在多个 CPU 上扩展网络模块,可以使用以下两种方法之一:每核心线程数、每内核io_service - 请参阅 HTTPServer2 和 HTTPServer3 示例。
无论如何,在我看来,为每个TCPSession
创建一个线程或io_service
似乎是不必要的开销 - 想想你有数千个TCPSession
的情况......