私は自分の 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
に 1 日遅れると、1 日待つことになります)。
C++ 標準 (30.5.1) は正しく表示されます。
26
効果:あたかも
return wait_until(lock, chrono::steady_clock::now() + rel_time);
Boost の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
に正しく実装しますか? これを正しく行う既存の実装はありますか? または、何か不足していますか?