有没有办法在你的应用程序中获得一个线程不再运行(已经返回)的通知? 我知道这在内核模式下是可行的(使用PsSetCreateThreadNotifyRoutine),但有没有办法从用户模式知道这一点,只使用Win32 API?
问题是我无法控制线程中的代码,因为我的模块是库的一部分。让驱动程序监视系统不会太难,但即使对于使用我的库的基本应用程序,用户安装驱动程序也很烦人。
我的代码使用TLS存储,在Linux / Unix下,pthread_key_create可以获取指向线程被销毁时调用的函数的指针。但是TlsAlloc(Windows)没有这样的......
提前致谢!
答案 0 :(得分:5)
Fibers也有类似的功能。来自MSDN:
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