Читаю libstdC++ implementation из std::condition_variable::wait_until
, вот источник:реализация станд :: condition_variable :: wait_until
template<typename _Clock, typename _Duration>
cv_status
wait_until(unique_lock<mutex>& __lock,
const chrono::time_point<_Clock, _Duration>& __atime)
{
// DR 887 - Sync unknown clock to known clock.
const typename _Clock::time_point __c_entry = _Clock::now();
const __clock_t::time_point __s_entry = __clock_t::now();
const auto __delta = __atime - __c_entry;
const auto __s_atime = __s_entry + __delta;
return __wait_until_impl(__lock, __s_atime);
}
template<typename _Clock, typename _Duration, typename _Predicate>
bool
wait_until(unique_lock<mutex>& __lock,
const chrono::time_point<_Clock, _Duration>& __atime,
_Predicate __p)
{
while (!__p())
if (wait_until(__lock, __atime) == cv_status::timeout)
return __p();
return true;
}
Второй вызов функции первой функции в loop.which будет делать операцию синхронизации часов .So, если мы вызываем вторую функцию, операция синхронизации может выполняться много раз. Нужно ли синхронизировать часы каждый раз? Я думаю, что код можно улучшить синхронизирующими часами только один раз во второй функции. Я прав?
Не могли бы вы объяснить: «Помните также, что в этом случае поток нужно было разбудить и пронести по нему уже, что, вероятно, дороже, чем запрос на часы». Я просто могу понять. – prehistoricpenguin
@prehistoricpenguin поток нужно было разбудить, чтобы продолжить выполнение, которое, вероятно, дороже, чем два вызова часов - дело в том, что это не стоит оптимизировать для общего случая. см. также ответ Шона для более подробной информации о обычных предположениях для wait_until. – BeyelerStudios
@ BeyerStudios, Спасибо за объяснение, получил его – prehistoricpenguin