<thread>: std::this_thread::sleep_for overflow with high precision durations #5234
Closed
Description
Describe the bug
Using integer durations with greater than nanosecond precision causes std::this_thread::sleep_for
to not sleep.
See https://godbolt.org/z/s37b31MsM and https://stackoverflow.com/questions/79355000/
Command-line test case
C:\Temp>type repro.cpp
#include <chrono>
#include <print>
#include <thread>
using picoseconds = std::chrono::duration<int64_t, std::ratio<1ll, 1'000'000'000'000ll>>;
int main()
{
auto t1 = std::chrono::steady_clock::now();
std::this_thread::sleep_for(picoseconds(1'000'000'000'000ll));
auto t2 = std::chrono::steady_clock::now();
std::println("{:%S}", t2 - t1);
}
C:\Temp>cl /EHsc /W4 /WX /std:c++latest .\repro.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.36.32522 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
/std:c++latest is provided as a preview of language features from the latest C++
working draft, and we're eager to hear about bugs and suggestions for improvements.
However, note that these features are provided as-is without support, and subject
to changes or removal as the working draft evolves. See
https://go.microsoft.com/fwlink/?linkid=2045807 for details.
repro.cpp
Microsoft (R) Incremental Linker Version 14.36.32522.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:repro.exe
repro.obj
C:\Temp>.\repro.exe
00.000057300
Expected behavior
The program should sleep for approximately a second but instead returns instantly.
STL version
MSVC version 19.41.33923
Additional context
A possible fix for this issue is to change:
constexpr auto _Forever = (chrono::steady_clock::time_point::max)();
in _To_absolute_time
to:
constexpr auto _Forever = (std::chrono::time_point<std::chrono::steady_clock, decltype(_Abs_time)::duration>::max)();