我正在运行一个提供服务的C++程序,并注意到即使在不处理任何请求的情况下,它也会占用std::sleep_for%的CPU.我将问题范围缩小到一个While循环,该循环调用std::sleep_for以防止服务退出.

为了进行测试,我编译并运行了以下简单的测试程序:

#include <chrono>
#include <thread>

int main(int argc, char * argv[])
{
    std::this_thread::sleep_for(std::chrono::hours::max());
}

我的期望是,这将睡眠很长一段时间,事实上,当我在我的M1 Mac上try 它时,我看到了预期的行为. 然而,当我在Redhat Linux 8机器上运行它时,它立即返回. 我还在Mac上运行的Rocky Linux 8 Docker容器上try 了它,这也立即返回. 这证实了这通常发生在RHEL 8系统上-或者至少在gcc 8.5.0上,因为编译器版本在两个Linux系统上是相同的(Mac上的编译器是Apple提供的clang).

这就解释了为什么我的服务占用了100%的CPU,因为它是在While循环中调用它的.但我从来没有听说过这种行为.还有其他人吗?

当然,我睡std::chrono::seconds(1)个小时可以很容易地解决这个问题.我问这个问题只是出于对知识的好奇.

推荐答案

这是libstdc++ https://godbolt.org/z/vce44vjx5中的一个bug,看起来像溢出.

它将nanossleep()呼叫内联到

timespec req{ -3600, 0 };  // -1 hour.
main:                                   # @main
        push    rbx
        sub     rsp, 16
        mov     qword ptr [rsp], -3600
        mov     qword ptr [rsp + 8], 0
        mov     rbx, rsp
.LBB0_1:                                # =>This Inner Loop Header: Depth=1
        mov     rdi, rbx
        mov     rsi, rbx
        call    nanosleep@PLT

Linux相关问答推荐

如何根据具体情况打印两行输出?

使用信号处理程序实现Hibernate 功能

UTF-8输入和使用XGetICValues

如何创建一堆文件中所有单词的列表?

如何使 awk 输出更具可读性?

如何在 ERE 中结束这个正则表达式

awk 打印除最后一列以外的所有内容 + 最后一列

erlang 格式的 utf8 变为 \x(反斜杠 x)ascii 编码

使用 bash 命令将文件从子文件夹复制到另一个

错误:命令gcc在 CentOS 上失败,退出状态为 1

Linux 上的 C++ 开发 - 我从哪里开始?

Linux:在目录下的文件列表中搜索特定单词

如何在没有 IDE 的情况下构建和部署三星 SmartTV 应用程序(例如:在 Linux 上)

如何通过 ssh 判断 ubuntu 服务器上是否存在 php 和 apache

使用单个命令打开 .tar.gz 文件

用于 ssh 的类似 teamviewer 的工具?

qstat 和长作业(job)名称

错误:ld.so:无法预加载对象 LD_PRELOAD:忽略

将所有文件扩展名转换为小写

如何使用cp从不同目录复制多个文件?