对于一个简单的采样分析器,我挂起一个目标线程,获取其当前的堆栈跟踪,然后继续它。 现在,如果线程处于等待状态,我想以不同的方式突出显示示例。
所以我想知道线程在挂起时是否正在阻塞(通过 WaitForSingleObject 等待,通过 Sleep 暂停,...)。
我可以通过 NtQuerySystemInformation(SystemProcessInformation) 获取此信息,但这比需要的要多得多,每个进程的每个线程的信息。
我还看到了Performance Counters ,但我不确定如果我只有线程 ID/句柄,这个 API 是否可行。
更新:
IInspectable 给了我一个提示 Wait Chain Traversal ,虽然它看起来很合适,但它返回所有挂起线程的状态 ObjectStatus==WctStatusBlocked
,这并非不合理,但对我的问题不起作用。我认为它也非常慢,因为它收集整个链的数据,而我只关心第一个元素。
最佳答案
虽然不完全是我想要的,QueryThreadCycleTime足够接近了。
因此每次线程被挂起时,QueryThreadCycleTime
被调用,它返回该线程到目前为止使用的 CPU 时钟周期数。
如果与前一次调用的差异低于某个限制,则当前样本被视为等待。
这并不完美,线程进入等待状态时获取的第一个样本未被检测为等待,并且该限制可能不适用于所有 CPU。
关于c - 获取挂起线程的ThreadState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52240779/