在一个线程中异步地从一个套接字读取多个使用方

时间:2019-06-07 10:23:08

标签: c++ asynchronous networking boost-asio fibers

我正在实现一个连接多路复用器类,该类包装单个连接以便提供在其上创建所谓的Stream-s的能力。一个物理连接上可以有数十个这样的流。

通过该连接发送的消息是由协议定义的,可以是服务消息(拥塞控制等),这些消息是客户端永远不会看到的,而数据消息是-包含流的一些数据,为此而定义在相应邮件的标题中。

read实现方法Stream时遇到问题。它必须是阻塞的,但是异步的,以便它返回一些值-数据读取或发生错误-但请求本身必须是某种异步队列。

为了实现异步网络IO,我们使用了带有补全令牌的Boost's async_read-s,async_write-s等,该令牌取自另一个库。因此,在我之前描述的术语中,对MyConnection::underlying_connection::read(size_t)的调用已经是异步的。

我实现的一个解决方案是函数MyConnection::processFrame(),它从连接,处理消息中读取数据,如果是数据消息,则将数据放入相应流的缓冲区中。该流将在while的{​​{1}}循环中调用。但是,在那种情况下,对read(即UB)的调用可能会多个。同样,这意味着甚至服务消息也要等到某个流想要读取数据时才这样做,这也是不合适的。

我提出的另一个解决方案是使用async_read-s,但是当我检查时,他们的方法future会阻塞整个线程(即使使用延迟的策略或成对的诺言),也必须避免

下面是一个简化的示例,其中仅包含一些方法,这些方法对于理解问题是必需的。这是当前的实现,其中包含错误。

wait/get

感谢将来的回答!

0 个答案:

没有答案