我正在编写一个使用 Boost asio 的网络库,我对是否应该使用单独的线程来运行 io_service 感到困惑。
我目前有一个包装所有 asio 工作的类。它有一个io_service,一个socket等,使用async_read和async_write方法与远程服务器通信。此类公开读取和写入方法以允许用户与远程服务器通信。
然后其他类调用此类,使用它的读/写方法向远程服务器发送和接收数据。在某些情况下,存在从服务器读取/写入数据的链式调用,直到调用最终用户提供的回调以传递计算的最终结果。
我现在正在尝试实现一个连接池,想知道我是否需要一个线程池:对远程服务器的所有读取和写入都使用异步方法,没有任何读取后处理涉及阻塞调用,直到最终用户提供的回调.让一系列连接对象同时运行而不需要单独的线程池不是可以吗?
最佳答案
如果您只有一个线程,那么当您获取数据并处理它时,您将阻塞任何其他调用。当然,如果您在 async_read
或 async_write
中做的唯一事情是启动下一个异步调用,那么 io_service
线程总是在等待新数据到达,并填充相关连接底层数据结构。一个线程没问题。
但是您可能有某种与读/写数据交互的处理,这是您可以与线程池并行化的部分。所以问题是:这个处理过程中消耗的时间比例有多大?是服务器的瓶颈(延迟和带宽)?
我过去在这里看到过不同的案例。一个案例是一个简单的服务器处理一个待完成的作业列表并将数据分派(dispatch)给客户端。它不需要线程,我不关心延迟,因为客户只是偶尔来,没有瓶颈。然后我遇到了另一个需要快速处理所有事情的案例,在这个例子中,我使用了一个线程池。
所以真正的问题是:瓶颈在哪里?
关于c++ - 什么时候应该将多线程与 asio 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54576038/