【发布时间】:2017-02-25 21:17:51
【问题描述】:
我在网上找到的许多示例都建议使用队列来管理 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 完成的速度快,因此队列在内存中任意增长,直到应用程序崩溃。
我尝试使用线程安全队列,如果队列达到一定大小,该队列会从前面弹出消息。问题是完成处理程序是唯一决定何时使用完数据的处理程序,因此我的方法失败了,因为它会在消息使用完毕之前弹出消息。
任何人都可以推动正确的方向吗?我可以使用两个队列来解决这个问题吗?
【问题讨论】:
标签: c++ queue boost-asio