Когда уместно использовать функцию C++11 *_until timeout вместо соответствующей функции *_for?

В 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?

22
задан Naveen 26 June 2012 в 04:27
поделиться