在Win 7应用程序中处理限制

Handle limits in Win 7 application

本文关键字:处理 应用程序 Win      更新时间:2023-10-16

我在Windows 7的C++中有一个多线程应用程序。此应用程序被编译为DLL,以供其他C#应用程序使用。

我长时间运行多线程代码来处理流数据。如果我将这个C++代码编译成一个独立的.exe,并运行代码,它就可以正常工作。

但是,当它被转换为DLL时,当C#代码与它一起运行时,该程序在长时间运行后会因访问违规错误而崩溃。当我从Python脚本加载DLL并长时间运行它时,我看到了类似的崩溃。

当我使用任务管理器观察行为时,我看到系统句柄计数以非常快的速度增加。在运行了大约2个小时的代码后,我看到句柄数突破了300000大关,并且不断增加。

在多线程代码中,线程不断地被创建和拆除。我看到线程退出后,CloseHandle函数并没有显式关闭线程句柄。这可能是一个潜在的问题吗?

我如何确认这是一个句柄问题。有什么方法可以更好地监视这些系统资源?在我尝试任何修复之前,我想知道所有可能的解决方案,因为测试运行需要很长时间,超过5个小时,才能重现崩溃。

SysInternal Process Explorer可以查看进程中的句柄,并将其标识为线程、互斥对象、文件等句柄。你肯定需要CloseHandle()每个线程句柄来清理它们。

顺便说一句,创建线程是一项昂贵的操作。如果您正在创建大量线程作业,最好将作业排队,并创建一个由有限数量的线程(通常约等于系统中CPU的数量)组成的池,这些线程从队列中提取并执行作业。