我编写了一个C++库,执行一些严重的CPU工作(所有工作都是数学和计算),如果让它自己运行,将轻松消耗所有可用的CPU资源(它也是多线程到机器上可用的逻辑核心数量)。
因此,我在主计算循环中设置了一个回调函数,使用库的软件应该调用这个函数:
while(true)
{
//do math here
callback(percent_complete);
}
在回调函数中,客户端调用Sleep(x)来减缓线程速度。
最初,客户端代码是一个固定的Sleep(100)调用,但这会导致性能不稳定,因为有些机器比其他机器更快地完成计算,但所有机器上的睡眠时间相同。所以现在客户端检查系统时间,如果超过1秒钟(即几次迭代),它将睡眠半秒钟。
这种减慢线程速度的方式可行吗?我应该使用信号量/互斥锁来代替Sleep()以最大化性能吗?每处理1秒的工作就睡眠x毫秒是否可以?还是我没有注意到什么问题?
我问这个问题的原因是,尽管任务管理器显示进程占用了约10%的CPU,但机器仍然严重卡顿。我已经探索了硬盘和内存争用,但无济于事,现在我想知道我减慢线程速度的方式是否导致了这个问题。
谢谢!