【问题标题】:Windows API safe termination of threadWindows API 安全终止线程
【发布时间】:2011-06-23 10:20:39
【问题描述】:

我在 Windows XP 上有 Delphi 应用程序。此应用程序使用 100 个线程。在某些情况下,我必须通过完全删除线程堆栈来终止线程。

我正在寻找像 terminatethread 这样的 WinAPI 函数,但它并不安全,并且: Windows Server 2003 and Windows XP/2000: The target thread's initial stack is not freed, causing a resource leak.

【问题讨论】:

  • 我正在寻找一种功能,可以安全地接管其他人的汽车,并让他们有条不紊地停下来,没有任何车祸......有人吗?任何人?比勒?

标签: multithreading delphi winapi thread-safety


【解决方案1】:

没有这样的功能。不可能存在这样的功能。 Windows 不可能知道该线程要清理哪些资源,并且它不知道如何这样做。这是您的应用程序的责任。

在我看来,你的做法是错误的。你应该在不使用武力的情况下以合作的方式终止线程。其他任何事情都必然会导致泄漏,并且很可能会导致其他更严重的问题。

【讨论】:

  • Snx 用于快速回放。我有另一种方法来解决我的问题,但有点困难
  • +1,我知道一种安全结束不同(远程)进程的方法(注入使用进程句柄执行 ExitProcess 的线程),但没有这样的方法可以安全结束线程.有 ExitThread,但会终止调用它的线程,所以没有任何用处。
  • 安全终止线程的唯一方法是请求它在准备好时自行终止。
  • @Marjan,据我所知,ExitProcessTerminateProcess 之间的唯一区别是 DLL 会收到来自前者的 DLL_PROCESS_DETACH 通知。我几乎不认为这更安全。事实上,MSDN 描述了一种情况,前者会导致死锁,而后者不会。文档详细说明了为什么从注入的线程调用 ExitProcess 不是一个好主意。
  • @Marjan,MSDN 所说的大多数事情都是在您调用ExitProcess 时发生的,而这些事情总是在进程结束时发生。这包括关闭文件句柄和将线程的状态设置为已发出信号。 MSDN 将它们全部称为它们的原因是描述它们发生的顺序
【解决方案2】:

如果您的应用程序线程都是用 Delphi 代码编写的,那么请考虑使用 OmniThreadLibrary,并使用它提供的服务,而不是原始的 Win32 API 或 TThread 的内置功能,这在最近的 Delphi 版本中相当不错。

但是,对于发出信号并关闭它们,尤其是在并非所有线程都由 Delphi THread 对象创建和管理的情况下,您必须完成大量设计,并且您可能需要结合一些Win32 原语一起构建了一个像样的解决方案。例如,我将使用使用 Win32 事件句柄以 C/C++ 编写的 Win32 事件和信号线程。

对于纯 100% 的 delphi 代码库,我会简单地使用任何经过良好测试的代码,并使用 TThread API 或 OmniThreadLibrary,而不是使用原始的 Win32 API。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多