2011-02-27 31 views
1

我写使用Boost短耳服务器应用程序只有一个插座:升压短耳,io_service对象处理每个核心

  1. 服务器:)从线程池(每个核心一个线程)运行io_service.run(,接受连接从套接字读取数据是异步完成的。
  2. 客户端:每个客户端连接并发送大量文件(〜500MB)到服务器。

问题:所有客户端都连接到服务器(客户端数量>服务器核心数量); io_service每个线程只处理一个连接/套接字,而来自其他套接字的数据不会被处理,直到其中一个处理的连接完成。

我希望来自所有连接套接字的数据能够被io_service线程池同时处理?

回答

1

预期的行为是什么?如果您有n线程调用io_service::run(),您的io_service只能调用n处理程序。如果未完成异步操作的数量大于n,则它们的处理程序将在io_service队列中等待,直到线程可以自由调用它们。

+0

我期望来自所有连接的客户端的数据被线程池处理(以较低的速率),而不是简单地阻止等待一个线程的所有其他客户端变为空闲。这意味着一个连接在整个数据传输过程中占用一个线程,即使我从套接字异步读取数据(这实际上是我正在经历的)。我有什么问题吗? – Aldin 2011-02-28 18:36:47

+0

@Aldin你怎么确定一个连接占用一个调用'io_service :: run()'的线程? – 2011-02-28 19:02:17

+0

我向连接:: handle_read()函数(服务器端)添加了一条日志消息,该函数打印连接远程端点的端口号,并且我只获得前两个连接(io_service线程池= 2)的读取,而其他连接被阻塞(没有日志消息),直到前两个连接之一完成,这可能需要一段时间,因为正在传输大型文件。 – Aldin 2011-02-28 19:37:44