7

Consider the following program:

#include <chrono>
#include <thread>

int main() {
    std::this_thread::sleep_until(std::chrono::steady_clock::now() - std::chrono::seconds(10));

    return 0;
}

When compiled with GCC 4.8.5, it will hang. When compiled with GCC 4.9 and above or clang3.4 and above, it returns immediately,

Why would it hang? As I understand, GCC 4.8.5 fully supports C++11 standard.

R. Taukulis
  • 203
  • 1
  • 6

2 Answers2

7

This is a confirmed bug that was fixed in gcc 4.9.

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58038

When using sleep_until() I get an bug with unsigned long scalar representations of a duration. If this duratoiin is in past, then you get an overflow in the length of the argument for sleep_for(). This causes an almost infinte sleep, instead of a fast return.

Drew Dormann
  • 59,987
  • 13
  • 123
  • 180
5

This case is considered by the Standard and according to it sleep_until should move on. Seems its a bug in GCC 4.8.5

[33.2.4 Timing specifications]

The member functions whose names end in _until take an argument that specifies a time point. These functions produce absolute timeouts. Implementations should use the clock specified in the time point to measure time for these functions. Given a clock time point argument Ct, the clock time point of the return from timeout should be Ct + Di + Dm when the clock is not adjusted during the timeout. If the clock is adjusted to the time Ca during the timeout, the behavior should be as follows:

  • if Ca > Ct, the waiting function should wake as soon as possible, (...), since the timeout is already satisfied. [ Note: This specification may result in the total duration of the wait decreasing when measured against a steady clock. — end note ] — if Ca < Ct, ...
R2RT
  • 2,061
  • 15
  • 25