减慢线程的最佳方法?使用睡眠()好吗?

Mah*_*dsi 8 c++ performance multithreading sleep cpu-usage

我编写了一个C++库来完成一些非常繁重的CPU工作(所有这些都是数学和计算),如果留给它自己的设备,将很容易消耗100%的所有可用CPU资源(它也是多线程的可用逻辑数量)机器上的核心).

因此,我在主计算循环中有一个回调,使用该库的软件应该调用:

while(true)
{
    //do math here
    callback(percent_complete);
}
Run Code Online (Sandbox Code Playgroud)

在回调中,客户端调用Sleep(x)来减慢线程.

最初,客户端代码是一个固定的Sleep(100)调用,但这会导致糟糕的不可靠性能,因为有些机器比其他机器更快地完成数学运算,但所有机器上的睡眠都是相同的.所以现在客户端检查系统时间,如果超过1秒(= =几次迭代),它将休眠半秒钟.

这是减慢线程的可接受方式吗?我应该使用信号量/互斥量而不是Sleep()来最大化性能吗?每1秒处理工作正在睡觉x毫秒,还是有什么不对的,我没有注意到?

我问的原因是,即使taskman显示该进程占用了大约10%的CPU,机器仍然会严重陷入困境.我已经探讨过硬盘和内存争用无济于事,所以现在我想知道我放慢线程的方式是否导致了这个问题.

谢谢!

Bri*_*sen 23

为什么不在计算线程中使用较低的优先级?这将确保安排其他线程,同时允许您的计算线程尽可能快地运行,如果没有其他线程需要运行.

  • 计算机大师,线程优先级在Windows上非常可靠.但是,如果您正在进行大量I/O(如果它是直接的或由内存分页引起的无关紧要),您可能也希望降低I/O优先级.请参见SetThreadPriority和THREAD_MODE_BACKGROUND_BEGIN. (11认同)
  • 实际上,这在Windows上并不是非常可靠.我已经将这个库移植到了OS X,它在那里工作就像一个优先级较低的梦,但在Windows上它仍然会导致问题.还有其他的东西:对于营销/技术支持目的,我们发现让软件在任务管理器中占用超过20%的CPU是一个坏主意,否则你会得到一些关于你的软件杀死PC性能的疯狂投诉和古怪的评论.人们看到50%的CPU使用率和恐慌! (4认同)

Ste*_*sop 2

睡眠应该适合限制应用程序,从您的评论来看,这就是您所追求的。也许您只需要更准确地了解自己的睡眠时间。

我唯一使用此类功能的软件是BOINC 客户端。我不知道它使用什么机制,但它是开源和多平台的,所以请自行帮助。

它有一个配置选项(“将 CPU 使用限制为 X%”)。我期望实现这一点的方法是使用依赖于平台的 API(例如clock()或 )GetSystemTimes(),并将处理器时间与经过的挂钟时间进行比较。做一些实际的工作,检查你是否超过或低于标准杆,如果超过标准杆,就睡一会儿,然后回到标准杆以下。

BOINC 客户端可以很好地处理优先级,即使在 100% 最大 CPU 情况下也不会导致其他应用程序出现任何性能问题。我使用节流阀的原因是,否则客户端会一直全力运行 CPU,并提高风扇速度和噪音。所以我在风扇保持安静的水平上运行它。如果有更好的冷却,也许我就不需要它了:-)