一段时间后,C++应用程序占用100%的cpu周期



在我的应用程序中,我使用了OOP的特性,如类、继承等。一段时间后,我还没有在应用程序中使用任何线程,这需要100%的CPU周期。有人能帮我找出可能的原因吗?

最可能的原因是一个无限循环(正如Jogojapan已经提到的)。找到它的最好方法是使用调试器,当代码开始使用高CPU时,看看它被困在哪里)。。

除非你运行的某个函数需要花费大量时间来做一件非常复杂的"事情",否则它很可能是由某种没有暂停的循环引起的。寻找类似do {...} while (!exit);的东西来修复它,你需要调用一个为os提供时间的函数,并对sleep(x)函数进行API调用,从而有效地将程序暂停"x"毫秒。如果您使用的是windows,这可以通过#include <windows.h>然后将sleep(10);放在循环的末尾来完成。"10"是任意的;但请注意,较小的值往往是随机的,如果你有很多图形(每秒30帧),任何小于33的值都可以,100左右的值对于主要涉及点击或菜单的事件驱动的事情都很好。

首先,CPU使用率100%当然不一定是个问题。如果该过程执行大量计算,而不是例如IO,则100%的CPU使用率可能是完全健康的,并且实际上是期望的。

但是,如果你真的觉得它在使用CPU周期,尽管它不应该,这里有一些通用的策略来处理它:

  1. 编写最初不太可能导致此类问题的代码。使用单元测试(对输入范围有很好的覆盖),避免退出条件过于复杂的循环。(对于简单或标准的情况,使用std::for_eachstd::generate等内置算法也有助于避免无限循环。)

  2. 使用日志消息,这样你就可以通过检查日志来跟踪你的程序正在做什么,即使是在几天后。如果你担心大量日志消息会增加计算负担,你可以实现它们,这样就有了运行时选项,甚至编译时选项来打开或关闭它们,或者选择细节级别。有各种日志记录框架可以提供帮助(甚至还有一个SO问题列出了它们,尽管它已经关闭,可能会被删除)。

  3. 如果以上内容没有帮助,并且您遇到的情况与您的文章中描述的情况类似,请使用调试器来确定您的进程所陷入的代码部分。如果必要,您可以在调试器中运行该程序几天或几周。当它达到100%的CPU使用率时,中断并检查调用堆栈以查看进程所在的位置。无限循环(或类似现象)可能会在相对较高的级别上发生,因此您可能需要在堆栈中来回走动以了解循环发生的位置。您也可以继续该过程,并在稍后再次中断。

最新更新