Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++11 std::this_thread::sleep_until() hangs when compiled with GCC 4.8.5

Tags:

c++

c++11

gcc4.8

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.

like image 946
R. Taukulis Avatar asked Dec 20 '17 22:12

R. Taukulis


2 Answers

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.

like image 76
Drew Dormann Avatar answered Nov 15 '22 17:11

Drew Dormann


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, ...
like image 27
R2RT Avatar answered Nov 15 '22 17:11

R2RT