下面的示例代码来自Stroustrup C ++ 4th Ed Page1234。我在质疑这是否在他的勘误文档中未列出勘误。由于超时,我在规格页面wait_for
上看到的内容可能会虚假返回,因此代码会引发系统错误。因此,它可能不是持续时间超时的结果。not_empty == false
任何人都可以确认这是该行为还是该代码反映了wait_for
行为方式?
template<typename T>
void Sync_queue::get(T& val, steady_clock::duration d)
{
unique_lock<mutex> lck(mtx);
bool not_empty = cond.wait_for(lck,d,[this] { return !q.empty(); });
if (not_empty) {
val=q.front();
q.pop_front();
}
else
throw system_error{"Sync_queue: get() timeout"};
}
您指的是这一部分:
1) ... It may also be unblocked spuriously.
关键的细节是,这仅描述了wait_for
第一个重载,即“ 1)”的含义,而不使用谓词。
第二重载是具有谓词参数的重载。第二次重载将在下面进行描述,它遵循wait_until
;如果您遵循的话,可以明确定义此重载:超时到期或谓词得到满足。这样就可以以预期的方式正确处理虚假唤醒。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句