我只是想知道是否有一种优雅的方法来设置一个特定的线程进行密集计算的最大CPU负载。现在,我已经找到了线程中最耗时的循环(它只做压缩),并使用硬编码值的GetTickCount()和Sleep()。它确保循环持续一定的时间,然后睡眠一定的最小时间。它或多或少地完成了这项工作,即。保证线程不会使用超过50%的CPU。然而,行为取决于CPU内核的数量(巨大的缺点)和简单的丑陋(较小的缺点)。有什么想法吗
GetTickCount()
Sleep()
js81xvg61#
我不知道有什么API可以让操作系统的调度程序做你想做的事情(即使你的线程是空闲优先级的,如果没有更高优先级的线程,你的线程也会运行)。不过,我认为你可以根据你已经在做的事情即兴创作一个相当优雅的节流函数。本质上(我没有一个Windows开发机器得心应手):选择线程在每次迭代中休眠的默认时间。然后,在每次迭代时(或者在每第n次迭代时,使得节流函数本身不会变成显著的CPU负载),1.计算自上次调用throttling函数以来线程使用的CPU时间量(我将此称为dCPU)。您可以使用GetThreadTimes() API来获取线程执行的时间量。1.计算自上次调用throttling函数以来经过的真实的时间(我将此函数称为dClock)。
unftdfkk2#
在Linux上,你可以用nice()来改变线程的调度优先级。
v8wbuo2f3#
问题是,当你有工作要做的时候,想让CPU空闲是不正常的。通常情况下,您将后台任务设置为IDLE优先级,并让操作系统处理调度交互式任务未使用的所有CPU时间。听起来问题出在看门狗进程上。如果你的后台任务是CPU密集型的,那么你希望它占用所有未使用的CPU时间。也许你应该看看修复看门狗程序?
ocebsuys4#
我想不出任何你想要的跨平台方式(或任何保证的方式句号),但当你使用GetTickCount时,也许你对跨平台不感兴趣:)我会使用进程间通信,并设置密集进程的级别,以获得您所需要的,但我不确定这是否适合您的情况。编辑:我同意伯纳德的观点,这就是为什么我认为一个过程而不是一个线程可能更合适,但它可能不适合你的目的。
kcrjzv8t5#
您可以更改线程的优先级,但更改最大利用率需要轮询和黑客来限制正在发生的事情的数量,或者使用可以设置进程最大利用率的操作系统工具。但是,我看不出任何情况下,你会想这样做。
5条答案
按热度按时间js81xvg61#
我不知道有什么API可以让操作系统的调度程序做你想做的事情(即使你的线程是空闲优先级的,如果没有更高优先级的线程,你的线程也会运行)。不过,我认为你可以根据你已经在做的事情即兴创作一个相当优雅的节流函数。本质上(我没有一个Windows开发机器得心应手):
选择线程在每次迭代中休眠的默认时间。然后,在每次迭代时(或者在每第n次迭代时,使得节流函数本身不会变成显著的CPU负载),
1.计算自上次调用throttling函数以来线程使用的CPU时间量(我将此称为dCPU)。您可以使用GetThreadTimes() API来获取线程执行的时间量。
1.计算自上次调用throttling函数以来经过的真实的时间(我将此函数称为dClock)。
1.让你的线程在计算的时间内休眠。
根据监视程序计算CPU使用率的方式,您可能需要使用GetProcessAffinityMask()来确定系统有多少CPU。dCPU /(dClock * CPU)是可用的总CPU时间的百分比。
您仍然需要为初始睡眠时间和递增/递减量选择一些神奇的数字,但我认为可以调整此算法,以使线程运行在相当接近确定的CPU百分比的位置。
unftdfkk2#
在Linux上,你可以用nice()来改变线程的调度优先级。
v8wbuo2f3#
问题是,当你有工作要做的时候,想让CPU空闲是不正常的。通常情况下,您将后台任务设置为IDLE优先级,并让操作系统处理调度交互式任务未使用的所有CPU时间。
听起来问题出在看门狗进程上。
如果你的后台任务是CPU密集型的,那么你希望它占用所有未使用的CPU时间。
也许你应该看看修复看门狗程序?
ocebsuys4#
我想不出任何你想要的跨平台方式(或任何保证的方式句号),但当你使用GetTickCount时,也许你对跨平台不感兴趣:)
我会使用进程间通信,并设置密集进程的级别,以获得您所需要的,但我不确定这是否适合您的情况。
编辑:我同意伯纳德的观点,这就是为什么我认为一个过程而不是一个线程可能更合适,但它可能不适合你的目的。
kcrjzv8t5#
您可以更改线程的优先级,但更改最大利用率需要轮询和黑客来限制正在发生的事情的数量,或者使用可以设置进程最大利用率的操作系统工具。但是,我看不出任何情况下,你会想这样做。