我只是想知道是否有一种优雅的方法来为执行密集计算的特定线程设置最大 CPU 负载。

现在我已经找到了线程中最耗时的循环(它只进行压缩)并使用 GetTickCount()Sleep() 具有硬编码值。它确保循环持续一段时间,然后休眠一段最短时间。它或多或少完成了这项工作,即保证线程不会使用超过 50% 的 CPU。
然而,行为取决于 CPU 核心的数量(巨大的缺点)并且非常丑陋(较小的缺点:))。
有任何想法吗?

有帮助吗?

解决方案

我不知道有任何 API 可以让操作系统的调度程序执行您想要的操作(即使您的线程处于空闲优先级,如果没有更高优先级的就绪线程,您的线程也会运行)。但是,我认为您可以根据您已经在做的事情即兴创作一个相当优雅的节流功能。本质上(我手头没有 Windows 开发机器):

选择线程每次迭代休眠的默认时间量。然后,在每次迭代中(或在每第 n 次迭代中,这样限制函数本身不会成为显着的 CPU 负载),

  1. 计算自上次调用节流函数以来线程使用的 CPU 时间量(我将其称为 dCPU)。您可以使用 获取线程时间() 用于获取线程执行时间的 API。
  2. 计算自上次调用节流函数以来经过的实际时间量(我将其称为 dClock)。
  3. dCPU / dClock 是(一个 CPU 的)CPU 使用率百分比。如果它高于您想要的,请增加您的睡眠时间,如果低于您的期望,请减少睡眠时间。
  4. 让您的线程休眠计算的时间。

根据您的看门狗计算 CPU 使用率的方式,您可能需要使用 获取进程亲和性掩码() 找出系统有多少个CPU。dCPU / (dClock * CPUs) 是可用 CPU 总时间的百分比。

您仍然需要为初始睡眠时间和增量/减量量选择一些幻数,但我认为可以调整该算法以保持线程运行在相当接近确定的 CPU 百分比的情况下。

其他提示

在Linux上,您可以使用nice()更改线程的调度优先级。

我想不出您想要的任何跨平台方式(或任何有保证的方式句号),但当您使用 GetTickCount 时,也许您对跨平台不感兴趣:)

我会使用进程间通信并将密集进程设置为良好的级别来满足您的需求,但我不确定这是否适合您的情况。

编辑:我同意 伯纳德 这就是为什么我认为进程而不是线程可能更合适,但它可能不适合您的目的。

问题是当您有工作要做时让 CPU 闲置是不正常的。通常,您将后台任务设置为 IDLE 优先级,并让操作系统处理调度它的所有交互式任务未使用的 CPU 时间。

在我看来,问题在于看门狗进程。

如果您的后台任务受 CPU 限制,那么您希望它占用其任务的所有未使用的 CPU 时间。

也许你应该考虑修复看门狗程序?

您也许可以更改线程的优先级,但更改最大利用率要么需要轮询和黑客来限制发生的事情数量,要么使用可以设置进程最大利用率的操作系统工具。但是,我没有看到您想要这样做的任何情况。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top