C++ 多线程何时应与asio一起使用?

C++ 多线程何时应与asio一起使用?,c++,c++11,boost-asio,C++,C++11,Boost Asio,我正在编写一个使用Boost asio的网络库,对于是否应该使用单独的线程来运行io_服务感到困惑 我目前有一个类,包装所有asio工作。它有一个io_服务、一个套接字等,并使用异步读取和异步写入方法与远程服务器通信。此类公开读写方法,允许用户与远程服务器通信 这个类随后被其他类调用,这些类使用它的读/写方法向远程服务器发送和接收数据。在某些情况下,存在从服务器读/写数据的链式调用,直到调用最终用户提供的回调传递最终计算结果为止 我现在正在尝试实现一个连接池,我想知道是否需要一个线程池:对远程服

我正在编写一个使用Boost asio的网络库,对于是否应该使用单独的线程来运行io_服务感到困惑

我目前有一个类,包装所有asio工作。它有一个io_服务、一个套接字等,并使用异步读取和异步写入方法与远程服务器通信。此类公开读写方法,允许用户与远程服务器通信

这个类随后被其他类调用,这些类使用它的读/写方法向远程服务器发送和接收数据。在某些情况下,存在从服务器读/写数据的链式调用,直到调用最终用户提供的回调传递最终计算结果为止


我现在正在尝试实现一个连接池,我想知道是否需要一个线程池:对远程服务器的所有读写都使用异步方法,在最终用户提供的回调之前,没有任何读后处理涉及到阻塞调用。如果同时运行一系列连接对象而不需要单独的线程池,这是否正常?

如果您只有一个线程,那么当您获取数据并处理它时,您将阻止任何其他调用。当然,如果在
async\u读取
async\u写入
中唯一要做的事情是启动下一个异步调用,那么
io\u服务
线程总是等待新数据到达,并填充相关的连接底层数据结构。只有一个线程没有问题

但是您可能有一些与读/写数据交互的处理,这是您可以与线程池并行的部分。所以问题是:在这个过程中所消耗的时间有多大?这是服务器的瓶颈(延迟和带宽)吗

我过去在这里看到过不同的案例。一个例子是一个简单的服务器处理一个要执行的作业列表,并将数据发送给客户端。它不需要线程,我也不关心延迟,因为客户端只会不时出现,没有瓶颈。然后我遇到了另一个需要快速处理所有内容的情况,在这个例子中,我使用了一个线程池


所以真正的问题是:瓶颈在哪里?

如果您只有一个线程,那么当您获取数据并处理它时,您正在阻止任何其他调用。当然,如果在
async\u读取
async\u写入
中唯一要做的事情是启动下一个异步调用,那么
io\u服务
线程总是等待新数据到达,并填充相关的连接底层数据结构。只有一个线程没有问题

但是您可能有一些与读/写数据交互的处理,这是您可以与线程池并行的部分。所以问题是:在这个过程中所消耗的时间有多大?这是服务器的瓶颈(延迟和带宽)吗

我过去在这里看到过不同的案例。一个例子是一个简单的服务器处理一个要执行的作业列表,并将数据发送给客户端。它不需要线程,我也不关心延迟,因为客户端只会不时出现,没有瓶颈。然后我遇到了另一个需要快速处理所有内容的情况,在这个例子中,我使用了一个线程池


因此,真正的问题是:瓶颈在哪里?

读取或写入数据时没有阻塞,处理接收到的数据的速度非常快,以毫秒为单位。有一个包含一个io_服务、多个连接对象和无线程的连接池,这样做还有意义吗?在这种情况下,我认为单线程就足够了。在这种情况下,通过线程化,您可能看不到任何性能改进(但您可以尝试测量,我可能错了)。是的,始终使用连接池,以便在每个连接上正确存储数据。是否有关于何时使用MT的规范规则?否,无规则。只有测量可以提示MT需求,然后进行算法分析。读取或写入接收到的数据时没有阻塞,处理速度非常快,以毫秒为单位。有一个包含一个io_服务、多个连接对象和无线程的连接池,这样做还有意义吗?在这种情况下,我认为单线程就足够了。在这种情况下,通过线程化,您可能看不到任何性能改进(但您可以尝试测量,我可能错了)。是的,始终使用连接池,以便在每个连接上正确存储数据。是否有关于何时使用MT的规范规则?否,无规则。只有测量才能提示机器翻译需求,然后进行算法分析。