在使用 Boost 线程的单个生产者/单个消费者应用程序中,如果生产者线程cond_var.notify_one()
在消费者线程调用之前多次调用会发生cond_var.wait(lock)
什么?
是否会堆叠额外的调用notify_one
,以便每个调用.wait()
将与调用 1:1 对应.notify_one()
?
编辑实现并发队列的常用示例具有以下方法:
void push(Data const& data)
{
boost::mutex::scoped_lock lock(the_mutex);
the_queue.push(data);
lock.unlock();
the_condition_variable.notify_one();
}
void wait_and_pop(Data& popped_value)
{
boost::mutex::scoped_lock lock(the_mutex);
while(the_queue.empty())
{
the_condition_variable.wait(lock);
}
popped_value=the_queue.front();
the_queue.pop();
}
我使用了一些非常相似的代码,并且经历了一些奇怪的内存增长,这似乎是由于消费者线程没有每次都醒来.notify_one()
(因为它仍在忙于做其他工作),并且想知道是否缺少“堆叠”可能是原因。
如果(有时)消费者线程无法跟上生产者线程,那么如果不堆叠此代码似乎会失败。如果我的理论是正确的,我将不胜感激有关如何修复此代码的建议。