Я читал мою реализацию STL (стандартная проблема g++ 4.6.2
) и наткнулся на этот бит состояния гонки внутри condition_variable
:
template<typename _Rep, typename _Period>
cv_status
wait_for(unique_lock<mutex>& __lock,
const chrono::duration<_Rep, _Period>& __rtime)
{
return wait_until(__lock, __clock_t::now() + __rtime);
}
Поскольку __clock_t
является std::chrono::system_clock
, мы привязаны к капризам таких вещей, как NTP (если часы возвращаются на следующий день после __clock_t::now() + __rtime
, то мы будем ждать один день).
Стандарт С++ (30.5.1) выглядит правильно:
26
Эффекты: как будто
return wait_until(lock, chrono::steady_clock::now() + rel_time);
Усиление condition_variable
имеет ту же проблему:
template<typename duration_type>
bool timed_wait(unique_lock<mutex>& m,duration_type const& wait_duration)
{
return timed_wait(m,get_system_time()+wait_duration);
}
Фактически, основная проблема pthreads кажется проблемой:
int pthread_cond_timedwait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex,
const struct timespec *restrict abstime);
потому что abstime
указывается как "системное время", а не монотонные часы.
Итак, мой вопрос: как правильно реализовать что-то вроде std::condition_variable::wait_for
? Есть ли существующая реализация, которая получает это право? Или я что-то упускаю?