В C++11 функции тайм-аута *_until
ведут себя "как ожидается" только в том случае, если устойчивые часы (т.е. те, которые движутся только вперед). с неизменной ставкой).Поскольку system_clock
не является постоянными часами, это означает, что такой код может вести себя довольно неожиданно:
using namespace std::chrono;
std::this_thread::sleep_until(system_clock::now() + seconds(10));
Это заставит текущий поток заснуть на 10 секунд, если системные часы не будут скорректированы в течение периода ожидания, например, для перехода на летнее время. Если часы переведены на час назад во время сна, текущий поток будет спать в течение часа и 10 секунд.
Насколько я могу судить, каждая *_until
функция тайм-аута в C++11 имеет соответствующую *_for
функцию, которая принимает длительность вместо момента времени. Например, приведенный выше код можно переписать следующим образом:
using namespace std::chrono;
std::this_thread::sleep_for(seconds(10));
Функции *_for
не должны беспокоиться о часах, которые настраиваются во время выполнения функции, потому что они просто сообщают, как долго ждать. , а не то, какое время должно быть, когда ожидание закончилось.
Эта проблема затрагивает не только функции ожидания, так как то же самое верно для основанных на тайм-ауте ожиданий фьючерсов и функций try_lock.
Единственная ситуация, в которой я могу предположить, что имеет смысл использовать *_until
функцию с нестабильными часами, это когда вы хотитепринять во внимание настройки часов, например, вы хотите спать до следующей среды в 3:30 утра, даже если между этим и потом будет переход на летнее время или с него. Существуют ли другие ситуации, когда функции *_until
имеют больше смысла, чем функции *_for
? Если нет, можно ли с уверенностью сказать, что в целом функции тайм-аута *_for
следует предпочесть функциям *_until
?