boost async 读/写失败,“系统资源不足,无法完成请求的服务”

Posted

技术标签:

【中文标题】boost async 读/写失败,“系统资源不足,无法完成请求的服务”【英文标题】:boost async read/write fails with "Insufficient system resources exist to complete the requested service" 【发布时间】:2016-07-12 08:28:57 【问题描述】:

我(似乎)随机收到错误:

“系统资源不足,无法完成请求的服务”

boost::asio::async_read_untilboost::asio::async_write 与串行端口一起使用时。

将串口声明为:

boost::asio::serial_port mSerialPort;

出现此错误,我尝试

try

    mSerialPort.cancel();
    mSerialPort.close();

catch(boost::system::system_error error)

    ;

其中一个(还不确定是哪个)挂起并且永远不会返回,甚至没有抛出异常。

一般来说,这个错误是什么意思?

有人遇到过这个问题吗?我应该特别调查任何方向吗?


编辑:

有问题的串行端口使用 USB 仿真器。

关于这个other SO Question,特别是Hans Passant 的评论,这个错误是否可能与设备驱动程序有关?我将相同的代码与另一个硬件组件一起使用,但从未出现过这种行为。


编辑 2:

在网络上搜索此特定错误消息时,通常建议增加分页池内存,如下所述:

Microsoft Support Article

在我的情况下这样做有什么意义吗?

【问题讨论】:

您是否尝试在您尝试传输的数据大小与错误出现之间建立关联? 数据的大小总是一样的,都是小命令和响应,大小在4-10个字符长左右。 遇到此问题时,您使用的是什么特定设备和设备驱动程序? 具有更新设备驱动程序的 MCP2200 微芯片 【参考方案1】:

自从我在 Windows 上使用串行端口以来已经很久很久了,所以请记住这个回复。从历史上看,早在 NT 4.0 时代,大多数从官方 NT 内核 DDK 指南中注销的串行端口驱动程序都无法正确执行异步 i/o,并且会不时因您的确切错误而失败和/或锁定。解决方案是仅将同步 i/o 与串行 i/o 一起使用,这样可以正常工作。如果您的基于 USB 的串行端口的驱动程序最初足够古老,则可能会重复此问题。

我还要确保您使用的设计模式与已知的工作模式相同。以http://www.ridgesolutions.ie/index.php/2012/12/13/boost-c-read-from-serial-port-with-timeout-example/ 为例。希望对您有所帮助。

【讨论】:

【参考方案2】:

该错误通常意味着主内存已用尽,系统正在交换内存,直到硬盘已满。根据您的程序运行的时间长短,它可能会因内存泄漏而发生。

但是,在您的情况下,驱动程序级别正在发生某些事情。您应该检查事件查看器,以防万一那里报告了某些内容(假设是 windows)。

你能从串口得到任何东西吗?根据您的代码,如果没有返回任何内容,则从端口读取将无限期阻塞。

要尝试的事情:

尝试一次读取一个字符 由于回调、线程等原因,异步可能很复杂。请尝试同步。 使用您的代码的设备是否通过同一个模拟器连接? 尝试增加正在读取的缓冲区 仔细检查设备使用的协议 双重检查波特率

这里有很棒的 boost/asio 资源(基于 POSIX,但一般信息适用于所有平台):http://www.webalice.it/fede.tft/serial_port/serial_port.html

【讨论】:

据我所知,软件中没有内存泄漏。进程使用的内存在任务管理器中不会随时间增加。通信(每 100 毫秒 TX/RX)可以正常工作一整天,然后错误发生一次。 Windows 事件查看器中没有任何内容。 好的,它运行一整天都没有问题。它仍然可能是 VM 页面池/大小的问题。您可以尝试增加虚拟内存,或者查看各种注册表黑客来调整它。如果您的磁盘整天都在运行 IO,那么它就像一个可以优化的文件服务器。也尝试停止防病毒。

以上是关于boost async 读/写失败,“系统资源不足,无法完成请求的服务”的主要内容,如果未能解决你的问题,请参考以下文章

boost asio async_read_some 只读数据

boost async_write:如果失败,如何跟踪未发送的内容并通知客户端/用户失败的内容?

Boost asio async_accept 在 Windows 下工作,但在 FreeBSD 下失败。怎么了?

Windows 7使用boost asio MinGW编译错误问题,怎么解决

boost asio ssl async_shutdown 总是以错误结束?

读\写 boost::binary_oarchive 到管道