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

现在我找到了线程中最耗时的循环(它只进行了压缩),并使用带有硬编码值的GetTickCount()Sleep() 它确保循环持续一段时间,而不是睡眠一段时间。 它或多或少的工作,即保证线程不会使用超过50%的CPU。
然而,行为取决于CPU核心的数量(巨大的劣势)和简单的丑陋(较小的劣势:))。
有任何想法吗?

===============>>#1 票数:20 已采纳

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

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

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

根据监视程序计算CPU使用情况的方式,您可能希望使用GetProcessAffinityMask()来查找系统具有的CPU数量。 dCPU /(dClock * CPUs)是可用CPU总时间的百分比。

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

===============>>#2 票数:4

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

===============>>#3 票数:2

我想不出任何你想要的跨平台方式(或者任何保证完全停止的方式)但是当你使用GetTickCount时或许你对跨平台不感兴趣:)

我会使用进程间通信并将密集进程设置为很好的级别以获得您需要的但我不确定这是否适合您的情况。

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

===============>>#4 票数:2

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

对我来说听起来像问题是看门狗过程。

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

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

===============>>#5 票数:0

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

  ask by Piotr Tyburski translate from so

未解决问题?本站智能推荐: