【发布时间】:2026-02-18 07:40:01
【问题描述】:
如果线程被销毁,是否可以得到通知?我已经在这里看到过这样的问题: Notification when a thread is destroyed
答案是:DLL_THREAD_DETACH,但在 TerminateThread 的情况下它不会被调用。 所以,我的问题是,是否有可能检测到终止?我不想阻止它,只是在我的任何线程被破坏时收到通知。我不一定要使用 DllMain,任何解决方案都会很棒!
我在一个 DLL 中工作,它被注入到我的主应用程序中,所以我不能使用 WaitForSingleObject,因为它会挂起主可执行文件。
感谢您的每一个回答。
(P.s.:为了理解,我的 dll 的工作方式如下:主应用程序加载 dll,在 DLL_PROCESS_ATTACH 上,我打开了一些线程。)
编辑: 我忘记了,我使用的是 windows 和 Visual Studio 2013。
编辑 2: 我来了,禁用线程库调用,没用。我的意思是它不像我想的那样工作:) /我删除了那部分,所以它不会误导任何人/
【问题讨论】:
-
但 DisableThreadLibraryCalls() 禁用 DLL_THREAD_ATTACH 和 DLL_THREAD_DETACH 通知。所以,你永远不会看到 DLL_THREAD_DETACH。
-
即使我启用它们,它也不会调用,所以我不再需要它了。还是我错了?
-
这个要求真的没有任何意义。如果您的 DLL 启动了一个线程,并且有人在外部杀死了该线程,那么您对此无能为力,该线程就消失了。检测到这一点的唯一方法是监视被杀死的线程。但是,怎样才能阻止攻击者杀死监视器呢?您将不得不求助于使用线程心跳并检测心跳何时停止,或者在每个进程中挂钩
TerminateThread()的每次出现,以便您可以检查您的 DLL 的线程 ID 之一是否是目标。我没有看到任何其他解决方法。 -
在
DllMain中创建线程几乎肯定迟早会死锁。如果您想了解原因,请阅读Dynamic-Link Library Best Practices。 -
@IInspectable:实际上,该文章似乎非常模糊地说明了为什么或在什么情况下创建线程可能是一个问题。它关于这个主题的所有内容(我能找到)是“如果你不与其他线程同步,创建一个线程可以工作,但它是有风险的。”
标签: c++ multithreading winapi callback notifications