线程销毁通知

时间:2014-06-19 09:58:18

标签: c++ multithreading winapi callback notifications

如果线程被销毁,是否可以收到通知?我在这里已经看到过这样的问题: 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: 我来到禁用线程库调用,是没用的。我的意思是它没有像我想象的那样工作:) /我删除了那部分,所以它不会误导任何人

3 个答案:

答案 0 :(得分:0)

我刚刚提到了有关DllMain()的文档:

  

如果你通过调用TerminateThread终止一个线程,那就是那个DLL   线程不会收到DLL_THREAD_DETACH通知。

因此,如果线程termanatin你将不会收到DLL_THREAD_DETACH。 关于DLL_THREAD_DETACH的重要思考是,如果"线程正在彻底退出"

,您将收到此通知。

答案 1 :(得分:0)

你可以运行一个观察者线程,它将监视你需要的所有线程并生成“没有更多线程”#34;通知。

答案 2 :(得分:0)

我建议让你的DLL生成自己的工作线程,然后可以在需要监视的线程的句柄上使用WaitForSingleObject()。当线程终止时,即使被TerminateThread()终止,也会发出句柄信号。更好的方法是使用WaitForMultipleObjects(),以便您的DLL可以在需要终止时发出工作线程的信号,例如使用CreateEvent()SetEvent()。这样,工作线程不需要运行忙循环来定期查找终止条件。