微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

windows – 挂钩线程创建/终止

是否有可能挂钩到 Windows上的线程终止? IOW,如果进程内的线程(对其他进程及其线程不感兴趣)已经终止(通常或者 – 更重要 – 强制),我希望得到通知.

或者,挂钩创建线程也可以.

基本原理:我有一个库,可以在每个线程的基础上管理一些信息(将其视为某些信息的进程范围的每线程缓存).线程终止时,我必须从缓存中删除所有特定于线程的信息. [缓存关联使用线程ID实现,可能会为将来的线程重用.]

“正常”执行顺序没有问题,因为库用户将从库中分离当前线程以清除状态.如果有人杀死拥有缓存资源的线程,问题就会开始出现.

您可以使用像 Detours这样的东西来执行Win32 API的API级挂钩,例如 TerminateThread.

不过,我不明白为什么你需要这样做.听起来你需要在线程死亡时清除线程的关联缓存,以便在另一个具有相同ID的线程出现时重新使用该槽.它是否正确?

如果是这样,当你收到DLL_THREAD_ATTACH事件时,你不能只清除DllMain中的缓存关联吗?这基本上是你的新线程通知.此时,您知道自己有一个新线程,清除现有的关联缓存是否安全?

可能有效的另一种选择是thread-local storage(TLS).您可以使用Win32 API(如TlsAlloc/TlsSetValue)来存储特定于线程的信息.您还可以使用__declspec(thread)定义变量,让编译器为您管理TLS.这样,每个线程都维护自己的缓存.每个线程的代码保持不变,但数据访问是相对于线程的.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐