Skip to content

<thread>: std::this_thread::sleep_for overflow with high precision durations #5234

Closed
@alanbirtles

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)();

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingchronoC++20 chronofixedSomething works now, yay!

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions