当线程被销毁时的通知

5

有没有一种方法可以在应用程序中得到一个线程不再运行(已返回)的通知?
我知道这在内核模式下是可能的(使用PsSetCreateThreadNotifyRoutine),但在用户模式下,只使用Win32 API就能知道这一点吗?

问题在于我无法控制线程中的代码,因为我的模块是库的一部分。监视系统需要编写驱动程序,但即使是对于使用我的库的基本应用程序,也会让用户感到烦恼。

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

提前致谢!


1
请参见以下链接:https://dev59.com/j3VC5IYBdhLWcg3wbQbA - Nick Dandoulakis
4个回答

5

使用Fibers可以实现类似的功能。来自MSDN:

FlsAlloc, FlsCallback, FlsFree

FlsCallback回调函数

应用程序定义的函数。如果FLS槽正在使用中,则在删除纤维、退出线程以及释放FLS索引时调用FlsCallback。


2
现在我发现这个在Win XP下不起作用,只有2003和Vista可以使用 :( - Gratian Lup

5

根据您拥有的库的类型而定。对于可以在DllMain (DLL_THREAD_DETACH)中处理线程终止的DLL。 MSDN指出这是处理TLS资源的最佳位置。

请记住,此回调仅在线程正常退出时调用(不是通过例如TerminateThread())。


是的,它是一个DLL。在我的情况下,这似乎最合适。 - Gratian Lup

2
您可以直接在线程句柄上调用WaitForSingleObject函数。

2
你可以尝试在ExitThread()上安装一个IAT patching API钩子...
这样做的好处是,你将在正在退出的线程上下文中运行,这可能对你有用,也可能没有。
参见此帖子:Windows API spying/hijacking techniques,了解一些关于这种钩子的详细信息...

1
自己注意,应该先问一下这个“库”是不是dll文件... - Len Holgate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接