【发布时间】:2014-04-12 01:19:13
【问题描述】:
我有一个用于 Windows 7 的 C++ 多线程应用程序。该应用程序被编译为 DLL 以供另一个 C# 应用程序使用。
我长时间运行多线程代码来处理流数据。如果我将此 C++ 代码编译成独立的 .exe,然后运行代码,它就可以正常工作。
但是当它变成一个 DLL 并且当 C# 代码使用它运行时,程序在长时间运行后崩溃并出现访问冲突错误。 当我从 Python 脚本加载 DLL 并长时间运行时,我看到了类似的崩溃。
当我使用任务管理器观察行为时,我看到系统句柄计数以非常快的速度增加。经过大约 2 小时的代码运行后,我看到句柄数超过 300,000 大关,并且还在不断增加。
在多线程代码中,线程被不断地创建和拆除。我看到线程退出后,线程句柄没有被 CloseHandle 函数显式关闭。这可能是一个潜在的问题吗?
如何确认这是句柄问题。有哪些方法可以更好地观察这些系统资源? 在尝试任何修复之前,我想知道所有可能的解决方案,因为测试运行需要很长时间(超过 5 个小时)才能重现崩溃。
【问题讨论】:
-
根据MSDN:线程对象保留在系统中,直到线程终止并且通过调用 CloseHandle 关闭它的所有句柄。
-
由于您是在寻求有关工具的建议,因此您的问题可能会被关闭。您可能希望对其进行编辑以重新关注原因,而不是查找原因的工具。同时,句柄泄漏肯定会造成问题,因为资源是在进程结束时由 Windows 释放的,而不是在卸载 DLL 时。
-
如果句柄在某个时候没有关闭——无论是在线程创建之后还是在它关闭时——那么这绝对是一个错误,当然可以解释你的症状。如果我是你,我会先修复这个错误,如果症状仍然存在,我只会担心进一步的故障排除。
标签: c++ windows multithreading handles