为什么 std::sleep_for(std::chrono::hours::max()) 在 Linux 上立即返回?

问题描述 投票:0回答:1

我正在运行一个提供服务的 C++ 程序,并注意到即使不提供任何请求,它也会占用 100% 的 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 上尝试它时,我看到了预期的行为。然而,当我在 Redhat Linux 8 机器上运行它时,它立即返回。我还在 Mac 上运行的 Rocky Linux 8 docker 容器上进行了尝试,这也立即返回。这证实了这种情况通常发生在 RHEL 8 系统上 - 或者至少在 gcc 8.5.0 上发生,因为两个 Linux 系统上的编译器版本是相同的(Mac 上的编译器是 Apple 提供的 clang)。

这解释了为什么我的服务占用了 100% 的 CPU,因为它是在 while 循环中调用它的。但我从未听说过这种行为。还有人吗?

当然,睡个

std::chrono::seconds(1)
就可以轻松解决问题。我只是出于求知欲才问这个问题。

c++ linux multithreading c++-chrono
1个回答
0
投票

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

它内联

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
© www.soinside.com 2019 - 2024. All rights reserved.