我是通过我的STL实现(标准问题g++ 4.6.2
)阅读和跨越该位的竞争条件传来condition_variable
内:实施condition_variable TIMED_WAIT正确
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)似乎得到它的权利:
效果:仿佛
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);
}
事实上,底层的并行线程执行,似乎是这个问题:
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
这样的东西?有没有一个现有的实现来解决这个问题?或者我错过了什么?
注意:在内部,'pthread_cond_timedwait'使用'gettimeofday',如果你想在你指定的时间内超时,它就是假的:http://sourceware.org/git/?p=glibc.git;a=blob; f = nptl/pthread_cond_timedwait.c; h = 7278ec45b0eb0b48be50fe832fcd17ae988dca27; hb = HEAD – 2012-08-10 00:50:40
您可能不得不使用一些其他使用单调时钟的计时器线程,然后在服务员取消之前将服务器唤醒。 – jxh 2012-08-10 00:53:09
如果我必须走得那么远(我非常希望我不这样做),我宁愿在我的'wait_for'函数中做一个旋转等待(看起来像我的'sleep_for'没有这个问题,因为'nanosleep'没有同样的问题,因为它正确使用'CLOCK_MONOTONIC')。 – 2012-08-10 00:58:13