【问题标题】:Why does this_thread::sleep_for not reduce CPU usage of while loop [closed]为什么 this_thread::sleep_for 不减少while循环的CPU使用率[关闭]
【发布时间】:2022-01-04 15:58:09
【问题描述】:

我有一个while循环如下:

while(true){
    //do stuff
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
}

当我查看 CPU 使用率时,它几乎是 100% ... 有没有任何方法可以在保留 CPU 周期的同时执行类似的操作,而无需使用复杂的条件变量?

编辑:“do stuff”检查队列以查看是否有要发送的事件...如果没有,则它什么也不做(超快),否则它通过 HTTP 发送事件。很少有活动(例如每 10 分钟一次)。

我知道你可以重写它以使用条件变量,但我更想弄清楚为什么会有这么多的 CPU 使用率。

【问题讨论】:

  • “做事”到底是什么? CPU 是否有可能忙于做这些“事情”,即它运行的时间远远超过 100 毫秒?
  • 速度非常快。即使我将睡眠时间设置为 1 或 2 秒,我仍然会获得 99% 的 CPU 使用率。
  • 条件变量并不复杂。这个问题暗示代码是多线程的,这意味着已经解决了同步问题,这是使用条件变量最复杂的部分。
  • 这里没有足够的信息来确定 CPU 使用率高的原因。原因很可能隐藏在//do stuff的细节中。
  • 当 CPU 使用率如此之高时,您是否使用分析器查看实际执行的内容?有没有可能完全在另一个线程中?

标签: c++ multithreading thread-synchronization


【解决方案1】:

因此循环不是消耗 CPU 的东西。使用分析器查看哪个线程实际上很忙。 CPU 使用率为 100%,这意味着所有内核都处于忙碌状态。在多核 CPU 上,一个繁忙的线程本身永远不会消耗 100% 的 CPU。

【讨论】:

    【解决方案2】:

    我找到了原因:在代码的逻辑过程中(“// do stuff”)有一个 continue 语句。 continue 语句导致线程跳过 sleep 语句,导致它连续循环。我将 thread_sleep 移到 while 循环的顶部,CPU 使用率从 99% 变为 0.1%

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-04
      • 2018-09-07
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      相关资源
      最近更新 更多