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

son*_*gun 15 c++ linux multithreading compiler-bug c++-chrono

我正在运行一个提供服务的 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());
}
Run Code Online (Sandbox Code Playgroud)

我的预期是它会休眠很长时间,事实上,当我在 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)。我只是出于求知欲才问这个问题。

S.M*_*.M. 9

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

它内联nanossleep()调用

timespec req{ -3600, 0 };  // -1 hour.
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)