线程退出后 WaitForSingleObject 为何存在延迟?微软揭秘底层机制Why is there a long delay between a thread exiting and the WaitForSingleObject returning?
微软资深工程师 Raymond Chen 解释了一个常见 Windows 编程现象:线程退出后,WaitForSingleObject 返回可能存在较长延迟。文章指出,这并非线程未真正退出,而是操作系统内核在清理资源时引入了短暂延迟,属于正常行为而非 bug。
Raymond Chen
有客户反馈,他们使用 WaitForSingleObject 函数等待某个线程退出,但即使该线程已经结束,WaitForSingleObject 调用仍超过一分钟才返回。是什么可能导致线程已终止却延迟报告?我们能否采取措施加快这一过程?
我的直觉告诉我,那个线程实际上并没有真正退出。
客户观察到的现象很可能是其线程过程已返回,从而发出线程结束的信号。但在线程过程退出后,系统还需执行多项操作。例如,系统需向所有 DLL(除非该 DLL 已通过 DisableThreadLibraryCalls 禁用相关调用)发送 DLL_THREAD_DETACH 通知,而这一过程需要获取加载器锁(loader lock)。
我建议通过调试器查看你认为已退出的线程当前状态。它可能正阻塞在等待加载器锁上,因为其他线程长时间占用该锁;也可能正在运行某个 DLL 的分离(detach)代码,而这段代码陷入了耗时较长的操作中。
我倾向于认为是后者:某个 DLL 在其分离代码中等待某项操作完成,而该操作耗时约一分钟。
我们尚未收到客户的回复,这可能意味着问题确实如我所料;也可能说明我的分析并未奏效,但客户认为无需进一步沟通而未继续跟进。遗憾的是,在许多此类客户调试案例中,我们最终都无从得知理论是否成立。(另一种可能是客户发来感谢信息,但客户联络人未将其转交工程团队,因为他们觉得不应再打扰对方。)
分类
主题
作者
Raymond 参与 Windows 系统演进已超过三十年。自 2003 年起,他运营了一个名为 The Old New Thing 的网站,其受欢迎程度远超他的想象,至今仍让他感到些许不安。该网站催生了一本同名书籍《The Old New Thing》(Addison Wesley, 2007)。他偶尔会在 Windows Dev Docs 的 Twitter 账号上出现,讲述一些毫无实用价值的故事。
需要完整排版与评论请前往来源站点阅读。