轮询命令以在 boost asio 中的共享队列中发送

Poll command to send in shared queue in boost asio

本文关键字:共享 队列 asio 命令 boost      更新时间:2023-10-16

我正在使用Boost asio制作服务器,但我遇到了一个问题。 我的服务器应该能够从多个连接的客户端接收数据,并将命令发送到特定的客户端。

为此,我正在为每个连接客户端实例化一个新的连接会话,其中我使用调用的回调调用async_write调用async_read等回调调用async_read...

我面临的问题如下:

有一个服务器的GUI,我可以在其中单击要发送的命令,然后将这些命令放入共享队列中。共享队列时,每个连接会话都可以轮询以查看是否有命令要发送到其连接的客户端。

问题是,在会话中使用"调用自己的回调"方案,如何在不破坏性能的情况下检查队列中何时有命令(我的第一个解决方案是在async_write操作上放置一个截止时间计时器,以便我可以检查每 X 秒)?

知道吗?

关键是,基于亲参与者的事件处理与轮询队列从根本上相反。

通常,您将创建一个队列并安排一个写入循环(使用 async_ 回调样式),直到耗尽。这方面的一个例子在这里:http://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/example/cpp03/chat/chat_client.cpp(查找chat_message_queuewrite_in_progress)。

基本上,你注入一个事件(即"消息排队"),让异步调用链耗尽队列。与对每条消息的操作进行排队相比,异步调用链的好处是会隐式排序/同步¹

¹ 隐式链 - 为什么在使用 boost::asio 时每个连接都需要链?