【问题标题】:Notification when a thread is destroyed [duplicate]线程被销毁时的通知[重复]
【发布时间】:2009-10-03 07:07:02
【问题描述】:

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

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

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

提前致谢!

【问题讨论】:

标签: c++ winapi multithreading


【解决方案1】:

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

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

【讨论】:

  • 是的,它是一个 DLL。这似乎最适合我的情况。
【解决方案2】:

Fibers 提供了类似的功能。来自 MSDN:

FlsAllocFlsCallbackFlsFree

FlsCallback 回调函数

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

【讨论】:

  • 现在我看到这在 Win Xp 下不起作用,只有 2003 和 Vista :(
【解决方案3】:

您可以简单地在线程句柄上调用 WaitForSingleObject。

【讨论】:

    【解决方案4】:

    您可以尝试在 ExitThread() 上安装 IAT 修补 API 挂钩...

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

    有关这种挂钩的一些详细信息,请参阅此帖子:Windows API spying/hijacking techniques...

    【讨论】:

    • 自我说明,应该询问“库”是否是 dll...
    猜你喜欢
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 2018-03-31
    • 1970-01-01
    相关资源
    最近更新 更多