线程被销毁时的通知

时间:2009-10-03 07:07:02

标签: c++ winapi multithreading

有没有办法在你的应用程序中获得一个线程不再运行(已经返回)的通知? 我知道这在内核模式下是可行的(使用PsSetCreateThreadNotifyRoutine),但有没有办法从用户模式知道这一点,只使用Win32 API?

问题是我无法控制线程中的代码,因为我的模块是库的一部分。让驱动程序监视系统不会太难,但即使对于使用我的库的基本应用程序,用户安装驱动程序也很烦人。

我的代码使用TLS存储,在Linux / Unix下,pthread_key_create可以获取指向线程被销毁时调用的函数的指针。但是TlsAlloc(Windows)没有这样的......

提前致谢!

4 个答案:

答案 0 :(得分:5)

Fibers也有类似的功能。来自MSDN:

FlsAllocFlsCallbackFlsFree

FlsCallback回调函数

  

应用程序定义的函数。如果   正在使用FLS插槽,FlsCallback是   调用光纤删除,线程退出,   并且当释放FLS索引时。

答案 1 :(得分:5)

取决于你拥有什么样的图书馆。对于DLL,可以在DllMain(DLL_THREAD_DETACH)中处理线程终止。 MSDN表示这是处理TLS资源的最佳位置。

请记住,此回调仅适用于干净地退出的线程(不是通过例如TerminateThread())。

答案 2 :(得分:2)

您只需在线程句柄上调用WaitForSingleObject即可。

答案 3 :(得分:2)

您可以尝试在ExitThread()...

上安装IAT修补API挂钩

这样做的好处是,您可以在退出的线程的上下文中运行,这可能对您有用,也可能对您没用。

有关此类挂钩的详细信息,请参阅此帖子:Windows API spying/hijacking techniques