是否存在Win32 API可获取系统全局所有运行状态线程的ID?
需求:获取Windows全局范围内所有运行状态线程的唯一ID列表
当前实现方式
目前通过未公开的NT API NtQuerySystemInformation() 实现,伪代码如下:
var processes = NtQuerySystemInformation(NTQUERYSYSTEMPROCESSINFORMATION); foreach (var process in processes) { foreach (var thread in process.threads) { if (thread.state == ThreadState.Running) { //do something } } }
核心问题
该方法存在全局原子性缺失的问题:NtQuerySystemInformation() 仅保证单进程级别的原子性(复制数据前会锁定进程结构),但无法保证跨进程、跨线程的全局原子性。因此会出现统计异常,比如在4C/4T的CPU上偶尔统计到7个处于运行状态的线程(超出理论最大值)。
API使用声明
明确知晓 NtQuerySystemInformation() 是未公开的NT API,不建议生产环境使用且可能随Windows版本变更失效。当前仅将其用于一次性场景,不会投入生产环境。
补充可行思路
另一种可行方向是遍历操作系统维护的处理器列表,从中获取每个CPU上的当前线程(内核调度器设计中,每个CPU维护指向当前线程的字段是合理的)。
该方案的局限性:遍历处理器列表时,当前线程字段可能被调度器更新,且执行统计的自身线程会被计入结果,但这些情况在当前场景下是可接受的。
内容的提问来源于stack exchange,提问作者tigrou
相关产品推荐
相关产品推荐

