CPU在C ++中进行调节
我只是想知道是否有一个优雅的方式来设置一个特定的线程进行密集计算的最大CPU负载。
现在我已经find了线程中最耗时的循环(它只是压缩),并使用带有硬编码值的GetTickCount()
和Sleep()
。 它确保循环持续一段时间,并且睡眠一定的最小时间。 它或多或less的工作,即保证线程不会使用超过50%的CPU。
但是,行为取决于CPU内核的数量(巨大的劣势),简单的丑陋(更小的缺点:))。
有任何想法吗?
我不知道有任何API可以让操作系统的调度程序做你想做的事情(即使你的线程空闲 – 优先级,如果没有更高优先级的就绪线程,你将运行)。 不过,我想你可以根据你已经在做的事情来制作一个相当优雅的节streamfunction。 本质上(我没有一个Windows开发机器方便):
select线程在每次迭代中将要hibernate的默认时间量。 然后,在每次迭代中(或者每隔n次迭代,节stream函数本身不会成为一个重要的CPU负载),
- 计算自上次调用throttling函数以来线程使用的CPU时间(我将称之为dCPU)。 您可以使用GetThreadTimes() API来获取线程执行的时间。
- 计算自上次调用throttling函数以来stream逝的实时量(我将调用此dClock)。
- dCPU / dClock是CPU使用率(一个CPU)的百分比。 如果它比你想要的高,增加你的睡眠时间,如果更低,减less睡眠时间。
- 让你的线程睡眠计算时间。
根据看门狗如何计算CPU使用率,您可能需要使用GetProcessAffinityMask()来查找系统有多less个CPU。 dCPU /(dClock * CPU)是可用CPU总时间的百分比。
您仍然需要为最初的睡眠时间和增量/减量select一些神奇的数字,但是我认为可以调整这个algorithm来保持一个线程运行在相当接近CPU的确定百分比。
在linux上,你可以用nice()来改变线程的调度优先级。
我想不出任何你想要的跨平台的方式(或任何保证的方式完全停止),但正如你使用GetTickCount,也许你不感兴趣跨平台:)
我会使用进程间通信,并设置密集的过程很好的水平,以得到你所需要的,但我不知道这是适合你的情况。
编辑:我同意伯纳德 ,这就是为什么我认为一个过程,而不是一个线程可能会更合适,但它可能不符合你的目的。
问题是在你有工作要离开CPU时,这是不正常的。 通常,您将后台任务设置为IDLE优先级,并让操作系统处理交互式任务未使用的所有CPU时间。
这听起来像问题是看门狗的过程。
如果您的后台任务是CPU限制的,那么您希望它将所有未使用的CPU时间用于其任务。
也许你应该看看修复看门狗程序?