执行Boost ASIO队列的最大尺寸
Enforce maximum size for boost ASIO queue
我在网上发现的许多示例建议使用一个队列来管理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
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- 从 Boost ASIO 获取 epoll 描述符 io_service对象
- 如何在 Boost.Asio 中使用 Zero-copy sendmsg/receive
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- 执行时使用 boost::asio::d eadline_timer 时出错
- Boost.Asio/OpenSSL HTTPS GET certificate trouble
- boost::asio data owning `ConstBufferSequence`
- 如何替换此示例代码片段中已弃用的handler_type_t或 boost::asio::handler_type?
- 如何将boost::asio::d eadline_timer 与Qt一起使用?
- 将更高的优先级设置为 boost::asio 线程处理进程
- Async_read_until限制读取的字节大小(Boost::asio)
- 程序崩溃使用boost::asio
- boost::asio 无法捕获 SIGINT
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- 如何在 boost::asio 中将打包的结构作为消息传递?(无序列化)
- 如何使用C++和Boost Asio从HTTP发布请求中获取键值
- std::boost::asio::p ost / dispatch 使用哪个io_context?