- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
条件变量可用于向其他线程发出信号,表明发生了某些事情:
mutex m;
condition_variable cv;
thread t1([&cv]{
// processing
...
cv.notify_one();
});
...
unique_lock<std::mutex> lck(m);
cv.wait(lck);
但是正如您所看到的,在我们等待通知之前,有一个机会窗口,线程处理完成并且通知正在通过,所以我们将永远等待。
在这种情况下,常见的解决方案是使用标志:
mutex m;
condition_variable cv;
bool done = false;
thread t1([&cv,&done]{
// processing
...
done = true;
cv.notify_one();
});
...
unique_lock<std::mutex> lck(m);
cv.wait(lck, [&done]{return done;});
使用标志是使用 condition_variable
的常见方式,还是我的解释有误?
最佳答案
条件变量应始终与您应该测试的某些条件相关联:
unique_lock<mutex> lck(m); while (!something) cv.wait(lck);
条件在持有互斥锁的同时被检查,这意味着互斥锁应该保护与条件相关的数据,因此您知道它不会在测试和等待之间发生变化。
测试是 while
而不仅仅是 if
因为某些条件变量实现(包括基于 pthreads 的实现)可能会虚假地唤醒,即当没有人发出信号时,所以你应该在循环中检查条件并在不正确时重新等待。有一个 wait
的重载,它接受一个谓词并通过等待直到谓词返回 true 来自动处理虚假唤醒,例如这是修改为使用检查条件的 lambda 的上述示例:
unique_lock<mutex> lck(m); cv.wait(lck, [&] { return something; });
(在简单的情况下,我发现显式的 while
循环更容易阅读。)
正在使用的条件变量可以被认为是一个由条件变量、互斥量和谓词组成的三元组,它们在概念上通过一起使用来等待条件变量而绑定(bind)在一起。特定条件变量对象上的所有并发等待必须使用相同的互斥量,并且通常也会等待相同的谓词(或依赖于相同数据的相关谓词,受相同互斥量保护。)
关于c++ - condition_variable 的常见用例场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10922728/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!