我正在实现一个连接多路复用器类,该类包装单个连接以便提供在其上创建所谓的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
感谢将来的回答!