如何检查线程是不是正在等待?

Posted

技术标签:

【中文标题】如何检查线程是不是正在等待?【英文标题】:How to check if a thread is waiting?如何检查线程是否正在等待? 【发布时间】:2014-01-27 13:23:07 【问题描述】:

出于分析和监控的目的,我想知道一个线程当前是处于活动状态(使用 CPU 时间)还是处于等待或休眠状态。

有没有办法查明线程当前是否处于各种 Windows 内核等待函数之一中?

从WaitForSingleObject到各种互斥锁、休眠、临界区、IOCP GetQueuedCompletionStatus等I/O函数等,有不少函数会导致线程等待。

是否有标准方法可以知道线程是否在等待?

【问题讨论】:

Win32_PerfFormattedData_PerfProc_Thread.ThreadState/ThreadWaitReason 在这里可能会有所帮助。 从 ProcessThread.WaitReason 很好地在 .NET 中可用。在本机代码中不太可用,.NET 使用几乎没有记录的 NtQuerySystemInformation()。 Win32_Thread WMI 类提供了它。 我已经注意到了,但是 WMI 不是非常慢并且意味着不经常查询吗?分析器必须每秒调用千分之一的时间,最好使用可忽略的 CPU 使用率(否则分析器将最大化海森堡效应) 【参考方案1】:

Wait Chain Traversal API 可以满足您的要求。还有更多。

【讨论】:

很有趣,虽然它似乎是为调试器准备的,我怀疑它可能不是很快。 根据问题,您正在编写广义上的调试器。无论如何,您总是可以尝试一下,看看性能如何。我没有解决性能问题,因为问题没有涵盖它。 好吧,我写了 profiling,如果一个 profiling 应用程序性能低下,它通常会通过海森堡效应变得无关紧要。 那我很抱歉。 "The only problem I see with the WCT API is that it does not report deadlocks when using WaitForMultipleObjects, which reduces its usefulness in many applications. "

以上是关于如何检查线程是不是正在等待?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查Android后台服务线程是不是正在运行

如何检查线程是不是处于休眠状态?

检查父线程是不是正在运行

java如何检查执行的线程已卡死

如何从主线程终止子线程[重复]

如何在 C++11 中检查分离线程的状态?