如何检查线程是不是正在等待?
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. "以上是关于如何检查线程是不是正在等待?的主要内容,如果未能解决你的问题,请参考以下文章