强制 boost ASIO 队列的最大大小

Enforce maximum size for boost ASIO queue

我在网上找到的许多示例都建议使用队列来管理 async_write 使用的消息,后者又使用完成处理程序,即 lambda,一旦 async_write 就会丢弃数据=] 完成。例如,来自 boost 示例的聊天服务器:http://www.boost.org/doc/libs/1_62_0/doc/html/boost_asio/example/cpp11/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 完成的速度快,因此队列在内存中增长到任意大,直到应用程序崩溃。

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

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

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

如果你不需要线程安全(即如果你使用一个strand)你可以考虑boost::circular_buffer.

否则Boost.Thread中有boost::sync_bounded_queue