执行Boost ASIO队列的最大尺寸

Enforce maximum size for boost ASIO queue

本文关键字:Boost ASIO 队列 执行      更新时间:2023-10-16

我在网上发现的许多示例建议使用一个队列来管理Async_write使用的消息,而Async_write又使用完整的处理程序I..E..E,Lambda,一旦async_write丢弃数据做完了。例如,来自Boost示例的聊天服务器:http://www.boost.org/doc/libs/1_62_0/doc/html/boost_asio/cpp1l/cpp11/chat/chat/chat_server.cpp。适用的代码如下:

  void do_write()
  {
    auto self(shared_from_this());
    boost::asio::async_write(socket_,
        boost::asio::buffer(write_msgs_.front().data(),
          write_msgs_.front().length()),
        [this, self](boost::system::error_code ec, std::size_t /*length*/)
        {
          if (!ec)
          {
            write_msgs_.pop_front();
            if (!write_msgs_.empty())
            {
              do_write();
            }
          }
          else
          {
            room_.leave(shared_from_this());
          }
        });
  }

但是,在我使用的应用程序中,可能会将消息推入write_msgs_的速度比async_write可以完成的速度快,因此队列在内存中任意大大,直到应用程序崩溃为止。

我尝试使用线程安全队列,如果队列达到一定尺寸,则将消息从正面弹出。问题在于,完成处理程序是唯一可以决定何时使用数据的处理程序,因此我的方法失败了,因为它会在使用之前弹出消息。

任何人都可以向正确的方向推动吗?我可以使用两个队列解决此问题吗?

您需要一个有限的队列,您需要以某种方式处理队列已满的情况。

如果您不需要线程安全性(即,如果使用链)可以考虑boost::circular_buffer

否则,boost.thread。

中有 boost::sync_bounded_queue