Winapi Win32:计算多核/多处理器系统中的线程CPU利用率

Winapi Win32:计算多核/多处理器系统中的线程CPU利用率,winapi,cpu,multicore,Winapi,Cpu,Multicore,我目前正在开发一个需要了解CPU利用率的MFC应用程序。它可能在不同的时间点有多个线程,但大部分工作是由主线程完成的 我试图找到一种方法来计算这个主线程使用了多少CPU。然而,我遇到了一些问题,比如如何在多CPU/多核环境中准确地实现这一点。问题是,大多数系统调用似乎提供系统信息,而我需要特定于主线程正在执行的处理器的信息 我已经看过WMI,但它似乎是一个过度的任务。GetThreadTimes()能满足我的需要吗?您的主线程可能在不同的CPU上、不同的时间执行,因此“特定于我的主线程正在执行的

我目前正在开发一个需要了解CPU利用率的MFC应用程序。它可能在不同的时间点有多个线程,但大部分工作是由主线程完成的

我试图找到一种方法来计算这个主线程使用了多少CPU。然而,我遇到了一些问题,比如如何在多CPU/多核环境中准确地实现这一点。问题是,大多数系统调用似乎提供系统信息,而我需要特定于主线程正在执行的处理器的信息


我已经看过WMI,但它似乎是一个过度的任务。GetThreadTimes()能满足我的需要吗?

您的主线程可能在不同的CPU上、不同的时间执行,因此“特定于我的主线程正在执行的处理器的信息”可能毫无意义——可能是所有处理器的信息。Windows不跟踪线程在哪个CPU上执行的时间,所以你不能问“给我一个每个CPU的线程执行时间列表”。唯一的例外是,当您将线程关联掩码设置为单个CPU时,您可以确定,如果线程执行,它将在该CPU上运行

对于计算运行时,GetThreadTimes是正确的API,是的。如果您想知道进程已使用(理论)CPU的百分比,请计算

(kerneltime+usertime) / (now - starttime) / numberofcpus
当然,这个公式假设所有CPU都具有相同的速度。如果要显示线程最近消耗的CPU部分,请每秒采样GetThreadTimes,然后计算

(usedtimenow - usedtimeprevious) / (now - previous) / numberofcpus
如果你每秒钟采样一次,现在previous大概是1,但是你应该记录采样的时间,不管怎样-系统可能不会让你在两次采样之间睡1秒