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