什么时候应该在asio中使用多线程?

时间:2019-02-07 14:52:21

标签: c++ c++11 boost-asio

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

我目前有一个包装所有asio工作的类。它具有一个io_service,一个套接字等,并使用async_read和async_write方法与远程服务器进行通信。此类公开读取和写入方法,以允许用户与远程服务器进行通信。

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

我现在正在尝试实现连接池,并且想知道是否需要线程池:所有对远程服务器的读取和写入都使用异步方法,没有任何读取后处理会阻塞调用,直到最终用户提供回调为止。在没有单独的线程池的情况下同时运行一系列连接对象不是很好吗?

1 个答案:

答案 0 :(得分:2)

如果只有一个线程,那么在获取数据并对其进行处理时,您将阻止其他任何调用。当然,如果您在async_readasync_write中唯一要做的是启动下一个异步调用,则io_service线程将始终等待新数据到达,并填充新数据。基础数据结构的相关连接。只需一个线程就没问题。

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

我过去在这里看到过不同的案例。一种情况是一台简单的服务器处理一份工作清单,并将数据分发给客户端。它不需要线程,我也不在乎延迟,因为客户端只会不时出现,并且没有瓶颈。然后我遇到另一种情况,需要快速处理所有事情,在这种情况下,我使用了线程池。

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