【问题标题】:Handle limits in Win 7 application处理 Win 7 应用程序中的限制
【发布时间】: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


【解决方案1】:

SysInternals Process Explorer 可以查看进程中的句柄,并将其识别为线程、互斥体、文件等句柄。你肯定必须 CloseHandle() 每个线程句柄来清理它们。

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

【讨论】:

    猜你喜欢
    • 2011-09-03
    • 2012-11-20
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2016-09-16
    • 2015-03-17
    相关资源
    最近更新 更多