CPU在C ++中进行调节

I was just wondering if there is an elegant way to set the maximum CPU load for a particular thread doing intensive calculations.

Right now I have located the most time consuming loop in the thread (it does only compression) and use GetTickCount() and Sleep() with hardcoded values. It makes sure that the loop continues for a certain period of time and than sleeps for a certain minimal time. It more or less does the job i.e. guarantees that the thread will not use more than 50% of CPU.
However behavior is dependent on the number of CPU cores (huge disadvantage) and simply ugly (smaller disadvantage :)).
Any ideas?

0
额外 编辑
意见: 1
你想实现什么样的行为?也就是说,这个监督人员想要从你的线索中得到什么?他们绝不应该使用超过80%的CPU吗?可以将进程基地优先级设置为闲置可能使WD平静吗?
额外 作者 wordmonger,

5 答案

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

0
额外
其他平台具有相似的功能,另请参阅: stackoverflow.com/questions/18884510/… 我认为这可以是一个很好的解决方案,虽然有不同的语义 - 即没有50%的CPU消耗保证
额外 作者 milianw,

我想不出任何你想要的跨平台方式(或任何保证方式完全停止),但因为你正在使用GetTickCount,也许你对跨平台不感兴趣:)

我会使用进程间通信并将密集的进程设置为很好的级别来获得所需的内容,但我不确定这适合您的情况。

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

0
额外

问题是,当你有工作要离开CPU时,这是不正常的。通常情况下,您将后台任务设置为IDLE优先级,并让操作系统处理交互式任务未使用的所有CPU时间。

这听起来像问题是看门狗过程。

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

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

0
额外
想要一个空闲的CPU是非常合理的。也许你想做一些计算,但不关心它完成的速度有多快,只要它不会让笔记本电脑上的CPU风扇旋转起来。
额外 作者 Ringding,

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

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

  1. 计算自上次调用throttling函数以来线程使用的CPU时间量(我将调用此dCPU)。您可以使用 GetThreadTimes() API获取您的时间线程一直在执行。
  2. 计算自上次调用调节函数以来流逝的实时量(我将调用此dClock)。
  3. dCPU / dClock是CPU使用率(一个CPU)的百分比。如果它比你想要的要高,那么增加你的睡眠时间,如果降低,减少睡眠时间。
  4. 让线程在计算时间内休眠。

根据您的看门狗如何计算CPU使用率,您可能需要使用 GetProcessAffinityMask()查找系统有多少个CPU。 dCPU /(dClock * CPU)是可用CPU总时间的百分比。

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

0
额外
如果你的目标是为了避免浪费CPU时间,一个更便宜的启发式可能是更好的选择。根据您的线程在高系统负载下自行挨饿的问题的多少,您可以检查过去的挂钟时间。在x86上,这很便宜,因为基于 rdtsc 的时间函数甚至不需要进入内核模式。即使 n 迭代进行多次系统调用也比只做一次更糟糕,除非它允许您大量增加 n 并仍然获得所需的行为。
额外 作者 Peter Cordes,

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

0
额外