我在网上发现的很多例子建议使用队列来管理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_,因此队列在内存中任意增大,直到应用程序崩溃。
我尝试使用线程安全队列,如果队列达到一定大小,则会从前面弹出消息。问题是,完成处理程序是唯一可以决定何时完成数据使用的处理程序,因此我的方法失败了,因为它会在使用完之前弹出消息。
任何人都可以提供正确的方向吗?我可以使用两个队列来解决这个问题吗?
答案 0 :(得分:0)
您需要一个有界队列,并且需要以某种方式处理队列已满的情况。
如果您不需要线程安全(即如果您使用线索),您可以考虑boost::circular_buffer
。
否则,Boost.Thread中有boost::sync_bounded_queue
。