#c #boost #boost-asio
#c #повышение #повышение-asio
Вопрос:
Класс Boost Asio basic_waitable_timer
(также входящий в сетевую TS C ) принимает параметр шаблона WaitTraits
, который допускает пользовательское поведение с точки зрения преобразования duration
и time_point
значений в длительности ожидания.
В частности, ожидается, что WaitTraits
класс будет иметь две перегрузки to_wait_duration
. Ожидается, что перегрузка, которая принимает time_point
значение, преобразует его в duration
значение, которое имеет смысл для значения продолжительности ожидания, которое может быть передано функции ожидания / ожидания операционной системы.
Здесь реализована реализация по умолчанию, wait_traits<Clock>
:
https://github.com/boostorg/asio/blob/develop/include/boost/asio/wait_traits.hpp
Однако, глядя на фактический исходный код реализации по умолчанию, я не могу понять, что to_wait_duration
на самом деле делает. Вот код:
static typename Clock::duration to_wait_duration(
const typename Clock::time_pointamp; t)
{
typename Clock::time_point now = Clock::now();
if (now (Clock::duration::max)() < t)
return (Clock::duration::max)();
if (now (Clock::duration::min)() > t)
return (Clock::duration::min)();
return t - now;
}
Я понимаю, что идея здесь в том, чтобы взять time_point
и преобразовать его в duration
значение, которое, вероятно, будет передано какой-либо функции ожидания ОС. Таким образом, очевидным способом сделать это было бы просто вернуть t - Clock::now()
. Конечно, вы также можете захотеть выполнить такие действия, как проверка на переполнение.
Но то, что, похоже, делает эта реализация, не имеет для меня никакого смысла. Во-первых, не будет ли выражение now Clock::duration::max()
всегда вызывать переполнение целого числа со знаком, вызывая, таким образом, неопределенное поведение?? (Предполагая, что Clock::duration::rep
это целочисленный тип со знаком, которым он был бы для стандартных chrono::duration
типов). Во-вторых, я не могу сказать, чего пытается достичь эта функция. Почему он когда-либо возвращает Clock::duration::min()
, которое обычно было бы отрицательным значением?
Я бы подумал, что to_wait_duration
функция просто выполнит что-то вроде проверки, если t > Clock::now()
, а если нет, просто вернет Clock::duration::zero()
(поскольку отрицательная продолжительность ожидания никогда не имеет смысла). В принципе, что-то вроде:
static typename Clock::duration to_wait_duration(const typename Clock::time_pointamp; t)
{
const typename Clock::time_point now = Clock::now();
return (t > now) ? (t - now) : Clock::duration::zero();
}
Но… то, что делает фактический исходный код Boost, меня очень смущает. Что на самом деле делает реализация Boost по умолчанию wait_traits
?