首先,让我们做一些事情说清楚(包括cppreference's page about std::condition_variable
的精华):
消费者
消费者wait
上使用以下步骤std::condition_variable
-s:
- 采集一个
std::unique_lock<std::mutex>
,与用于保护共享变量的相同互斥体
- 执行wait,wait_for或wait_until。等待操作以原子方式释放互斥体并挂起线程的执行。
- 当条件变量被通知时,超时到期或虚假唤醒发生,线程被唤醒,并且互斥体被自动重新获取。 线程应该检查条件,并且如果唤醒是虚假的,则继续等待。
生产者
生产者notify
相同std::condition_variable
-s以下步骤:
- 获取一个std ::互斥(通常通过标准:: lock_guard)
- 执行修改同时锁持有
- 执行
notify_one
或notify_all
Ëstd::condition_variable
(锁不需要追究通知)
回答
不等待的线程首先获取访问互斥它被通知,并等待线程可以尝试后要删除的元素
是,可能有多个消费者在相同条件下,和他们每个人可以消费的单个对象,这就是为什么每一个等待的线程应该防止SP使用额外的逻辑条件可以唤醒唤醒(请参阅消费者部分中的粗体文本)。的std::condition_variable
的wait
方法甚至有已经包括它特定的原型:
template< class Predicate >
void wait(std::unique_lock<std::mutex>& lock, Predicate pred);
当消费者被唤醒时,它已经收购了锁!因此,如果满足条件(例如!queue->empty()
),它可以安全地消耗。
你最好展示一些(伪)代码,这很难理解你在问什么。 – Slava