gpt4 book ai didi

c++ - std::condition_variable::wait with predicate

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:03 26 4
gpt4 key购买 nike

在 std::condition_variable 的文档中,有一个以谓词函数作为参数的 wait() 重载。该函数将等到谓词函数为真的第一个 wake_up。

documentation

据说这等同于:

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; })

关于c++ - std::condition_variable::wait with predicate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33692574/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com