为boost ASIO队列强制执行最大大小

时间:2017-02-25 21:17:51

标签: c++ queue boost-asio

我在网上发现的很多例子建议使用队列来管理async_write使用的消息,而async_write又使用完成处理程序i..e,lambda,一旦async_write完成就丢弃数据。例如,来自增强示例的聊天服务器: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());
          }
        });
  }

但是,在我正在使用它的应用程序中,消息可能比async_write更快地被推送到write_msgs_,因此队列在内存中任意增大,直到应用程序崩溃。

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

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

1 个答案:

答案 0 :(得分:0)

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

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

否则,Boost.Thread中有boost::sync_bounded_queue