【问题标题】:Win32: Atomic Execution of Code BlockWin32:代码块的原子执行
【发布时间】:2008-11-13 21:20:47
【问题描述】:

我有两个系统调用 GetSystemTime() 和 GetThreadTimes() 我需要计算给定 Win32 线程的 CPU 利用率。

为了准确起见,我需要确保 GetSystemTime() 和 GetThreadTimes() 都是原子执行的;即在调用 GetSystemTime() 和 GetThreadTimes() 之间不应有上下文切换。

原因是有时我会得到超过 100% 的百分比(约 500 分之一)。

如何确保两个函数调用的原子执行?

谢谢, 萨钦

【问题讨论】:

  • 有没有办法直接查询Windows你线程的CPU利用率?

标签: winapi atomic context-switch


【解决方案1】:

您最好的选择是为计算线程分配实时优先级。实时线程只会被其他实时线程(或提升到实时优先级的线程)抢占。

【讨论】:

  • 这仍然是可中断的。
【解决方案2】:

我不太确定你能做到。除非您知道每个函数中的底层操作是什么,并且因为它们恰好是 Windows API 调用...祝您好运。

难道不能只调整超过 100 的百分比吗?

perc = ( perc > 100.0f ) ? 100.0f : perc;

【讨论】:

    【解决方案3】:

    遗憾的是没有办法。在 Win32 中的两个系统调用之间,没有办法阻止您的进程/线程被上下文切换。否则,如果有人通过拒绝每次关机来实现锁定系统的进程,那将是微不足道的。

    【讨论】:

      【解决方案4】:

      以相反的顺序调用函数会有帮助吗? (99% 优于 101%...)

      此外,如果您在执行此操作之前强制进行上下文切换(例如通过调用 Sleep()),您可能会减少被切换出去的机会。不过,我不知道这会有多好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-26
        • 2014-12-15
        • 2011-06-06
        相关资源
        最近更新 更多