在 std::condition_variable 的文档中,存在以谓词函数作为参数的 wait() 重载。该函数将等待,直到谓词函数为 true 的第一次wake_up。
In the 文档 http://en.cppreference.com/w/cpp/thread/condition_variable/wait
据说这相当于:
while (!pred()) {
wait(lock);
}
但是也:
这种过载可用于在等待特定条件成立时忽略虚假唤醒。请注意,在进入该方法之前必须获取锁,在 wait(lock) 退出后也会重新获取锁,即锁可以用作 pred() 访问的保护。
我不确定是否理解,这些是否严格等效(在这种情况下,我更喜欢普通的 while 循环,它比我的情况下使用 lambda 的重载更容易阅读),或者重载(可能取决于实现)更有效吗?
实现是否可以在唤醒等待线程之前评估通知线程中的谓词,以避免在测试条件为 false 时唤醒?这里需要c++线程大师...
Thanks
从性能的角度来看,实现可以尝试使其比循环更好,但我怀疑这是可能的。它非常简单,您可以检查您的实现以了解它是如何完成的。这就是 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; })
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)