是否有可能挂钩到
Windows上的线程终止? IOW,如果进程内的线程(对其他进程及其线程不感兴趣)已经终止(通常或者 – 更重要 – 强制),我希望得到通知.
或者,挂钩创建线程也可以.
基本原理:我有一个库,可以在每个线程的基础上管理一些信息(将其视为某些信息的进程范围的每线程缓存).线程终止时,我必须从缓存中删除所有特定于线程的信息. [缓存关联使用线程ID实现,可能会为将来的线程重用.]
“正常”执行顺序没有问题,因为库用户将从库中分离当前线程以清除状态.如果有人杀死拥有缓存资源的线程,问题就会开始出现.
您可以使用像
Detours这样的东西来执行Win32 API的API级挂钩,例如
TerminateThread
.
不过,我不明白为什么你需要这样做.听起来你需要在线程死亡时清除线程的关联缓存,以便在另一个具有相同ID的线程出现时重新使用该槽.它是否正确?
如果是这样,当你收到DLL_THREAD_ATTACH事件时,你不能只清除DllMain中的缓存关联吗?这基本上是你的新线程通知.此时,您知道自己有一个新线程,清除现有的关联缓存是否安全?
可能有效的另一种选择是thread-local storage(TLS).您可以使用Win32 API(如TlsAlloc
/TlsSetValue
)来存储特定于线程的信息.您还可以使用__declspec(thread)
定义变量,让编译器为您管理TLS.这样,每个线程都维护自己的缓存.每个线程的代码保持不变,但数据访问是相对于线程的.