You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否存在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 06:32:38