C++ C++;应用程序在一段时间后需要100%的cpu周期

C++ C++;应用程序在一段时间后需要100%的cpu周期,c++,cpu,cpu-usage,C++,Cpu,Cpu Usage,在我的应用程序中,我使用了OOP的特性,如类、继承等。 我还没有在应用程序中使用任何线程,但经过一段时间,它需要100%的CPU周期。 有人能帮我找出可能的原因吗?最可能的原因是无限循环(正如Jogojapan已经提到的)。找到它的最佳方法是使用调试器,并查看当代码开始使用高CPU时代码在哪里被卡住)除非您运行的某个函数需要花费大量时间来完成一件非常复杂的“事情”,否则它很可能是由某种没有暂停的循环引起的。在(!exit)时查找类似于do{…}while的内容要修复它,您需要调用一个为操作系统提

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

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

除非您运行的某个函数需要花费大量时间来完成一件非常复杂的“事情”,否则它很可能是由某种没有暂停的循环引起的。在(!exit)时查找类似于
do{…}while的内容
要修复它,您需要调用一个为操作系统提供时间的函数,并对
sleep(x)
函数进行API调用,该函数有效地将程序暂停“x”毫秒。如果您使用的是windows,可以通过
#include
然后放入
睡眠(10)。"10"是任意的,;但请注意,较小的值往往表现为随机性,如果有大量图形(30 fps),小于33就可以了,对于主要涉及单击或菜单的事件驱动的事情,100左右是好的。

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

但是,如果您确实觉得它在使用CPU周期,尽管它不应该这样做,这里有一些通用的策略来解决这个问题:

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

  • 使用日志消息,以便您可以通过检查日志来跟踪程序正在执行的操作,即使在几天后也是如此。如果您担心大量日志消息会增加计算负担,那么可以实现它们,这样就有了运行时、甚至编译时选项来打开或关闭它们或选择详细级别。有各种各样的日志框架可以提供帮助(甚至还有一个日志框架,尽管它已经关闭并且可能会被删除)

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


  • 没有更多的信息?可能不是。。。编辑:你有多少个CPU?你使用哪个操作系统?如果一个内核的利用率为100%,而两个内核的利用率为100%,则带有Top命令的Linux将显示100%。等等。您可能希望在调试器中运行它,并在一段时间后中断它,以查看它在代码中的位置。也许它被困在一个无限循环中。这里重要的不是所用语言的特性,而是算法/设计以及使用的习惯用法。@ta.speot.is,接口的存在或不存在究竟如何直接影响CPU的使用?谢谢KK。我尝试了调试器,但问题没有重现。只有在我运行应用程序1-2天的情况下,我才能看到这个问题。@Amar:如果您有时间进行测试,为什么不让它在调试器中运行三天左右,并在它卡住时暂停以查看程序是否正确?@Amar。让它运行2天或更长时间。。当您看到应用程序正在消耗所有资源时,可以将调试器附加到应用程序。或者,您可以按照@ted的建议,从一开始就在调试器中运行代码(但我个人不建议这样做)。