У меня есть то, что я считал простым шаблоном: я хочу сделать точку времени на 5 секунд в будущем, запустить задачу, которая может занять некоторое время, а затем спать до этой точки времени (возможно, вообще не спать, если это время уже достигнуто) .) Однако всякий раз, когда я пытаюсь использовать std::this_thread::sleep_until
с моментом времени в прошлом, мое приложение вместо этого зависает навсегда. Вот MCVE:
#include <chrono>
#include <thread>
int main(){
std::this_thread::sleep_until(std::chrono::steady_clock::now() - std::chrono::seconds(1));
}
Используя g++ (GCC) 4.8.5, это никогда не возвращается. Я также пробовал system_clock с теми же результатами. Используя strace для изучения того, что происходит, последнее, что я получаю, это:
nanosleep({4294967295, 0},
поэтому я думаю, что в конце концов он вернется, но я не хочу ждать так долго.
Это баг g++? Я не могу представить, что такое поведение является преднамеренным. Я нашел вопрос Хорошо ли определено поведение, когда sleep_until()
указывает момент времени в прошлом? но не похоже, что на самом деле был сделан какой-либо вывод о том, действительно ли стандарт указывает, что должно произойти. С тех пор я реализовал другое решение моей проблемы; Мне просто любопытно, является ли то, что я вижу, UB или ошибкой.