为什么 this_thread::sleep_for 不减少 while 循环的 CPU 使用
Why does this_thread::sleep_for not reduce CPU usage of while loop
我有一个 while 循环如下:
while(true){
//do stuff
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
当我查看 CPU 使用率时,它几乎是 100% ... 是否有 任何 方法在保留 CPU 的同时做这样的事情循环而不必使用复杂的条件变量?
编辑:“do stuff”检查队列以查看是否有任何事件要发送...如果有 none,则它什么都不做(超快),否则它会通过以下方式发送事件HTTP。很少有活动(例如每 10 分钟一次)。
我知道您可以重写它以使用条件变量,但我更愿意弄清楚为什么有这么多 CPU 用法。
因此循环不是消耗 CPU 的东西。使用探查器查看哪个线程实际上很忙。 100% CPU 使用率意味着所有核心都在忙碌。在多核 CPU 上,一个繁忙的线程本身永远不会消耗 100% CPU。
我找到了原因:在代码逻辑(“// do stuff”)中有一个 continue 语句。 continue 语句导致线程跳过 sleep 语句,导致它不断循环。我将 thread_sleep 移动到 while 循环的顶部,CPU 使用率从 99% 变为 0.1%
我有一个 while 循环如下:
while(true){
//do stuff
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
当我查看 CPU 使用率时,它几乎是 100% ... 是否有 任何 方法在保留 CPU 的同时做这样的事情循环而不必使用复杂的条件变量?
编辑:“do stuff”检查队列以查看是否有任何事件要发送...如果有 none,则它什么都不做(超快),否则它会通过以下方式发送事件HTTP。很少有活动(例如每 10 分钟一次)。
我知道您可以重写它以使用条件变量,但我更愿意弄清楚为什么有这么多 CPU 用法。
因此循环不是消耗 CPU 的东西。使用探查器查看哪个线程实际上很忙。 100% CPU 使用率意味着所有核心都在忙碌。在多核 CPU 上,一个繁忙的线程本身永远不会消耗 100% CPU。
我找到了原因:在代码逻辑(“// do stuff”)中有一个 continue 语句。 continue 语句导致线程跳过 sleep 语句,导致它不断循环。我将 thread_sleep 移动到 while 循环的顶部,CPU 使用率从 99% 变为 0.1%