在std :: condition_variable的文档中,有一个wait()重载作为参数作为谓词函数.该函数将一直等到谓词函数为真的第一个wake_up.
据说这相当于:
while (!pred()) {
wait(lock);
}
但是也:
This overload may be used to ignore spurious awakenings while waiting for a specific condition to become true. Note that before enter to this method lock must be acquired, after wait(lock) exits it is also reacquired, i.e. lock can be used as a guard to pred() access.
我不太明白,这些是否严格等效(在这种情况下,我更喜欢简单的while循环,这比我在案例中使用lambda的重载更容易阅读),还是过载(可能依赖于实现)更有效?
实现是否可以在唤醒等待线程之前评估通知线程中的谓词,以避免在测试条件为假时唤醒?这里需要c线程大师……
谢谢
最佳答案 从性能的角度来看,实现可以尝试使其优于循环,但我怀疑它是否可行.这是非常严格的,你可以检查你的实现,看看它是如何完成的.这就是gcc 4.9.2在这里做的:
template<typename _Predicate>
void
wait(unique_lock<mutex>& __lock, _Predicate __p)
{
while (!__p())
wait(__lock);
}
正如你所看到的,它完全一样,我怀疑在这里可以做些什么.至于可读性,它比循环更易读.但是,你可能误解了原因.这个循环简单地应该检查由条件保护的实变量是否确实变为你期望的值 – 因为它可能没有.通常的代码剪辑看起来像这样:
cond_var.wait(lock, []() { return bool_var == true; })