我正在阅读我的 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
,那么我们将等待一天)。
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
正确实现类似的东西?是否有现有的实现可以做到这一点?还是我错过了什么?