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.
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.
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
, ...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With