C++ Boost条件变量-对“执行调用”;通知“你一个”;堆栈

C++ Boost条件变量-对“执行调用”;通知“你一个”;堆栈,c++,boost,boost-thread,C++,Boost,Boost Thread,在使用Boost线程的单生产者/单消费者应用程序中,如果生产者线程在消费者线程调用cond\u var.notify\u one()之前调用多个cond\u var.wait(lock),会发生什么情况 对notify\u one的附加调用是否会叠加,以便对.wait()的每个调用都将与.notify\u one()调用1:1对应 编辑用于实现并发队列的方法有以下几种: void push(Data const& data) { boost::mutex::scoped_lock

在使用Boost线程的单生产者/单消费者应用程序中,如果生产者线程在消费者线程调用
cond\u var.notify\u one()
之前调用多个
cond\u var.wait(lock)
,会发生什么情况

notify\u one
的附加调用是否会叠加,以便对
.wait()
的每个调用都将与
.notify\u one()
调用1:1对应

编辑用于实现并发队列的方法有以下几种:

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()
(因为它仍然忙于做其他工作),我想知道是否缺乏“堆叠”可能是原因


如果(有时)使用者线程不能跟上生产者线程,那么如果不堆叠代码,代码就会失败。如果我的理论是正确的,我将感谢关于如何纠正此代码的建议。

notify\u one的规范是:

C++11 30.5.1/7:效果:如果任何线程在等待
*this
时被阻止,请取消阻止其中一个线程

因此答案是否定的:调用
notify_one
notify_all
只会唤醒当前正在等待的线程,以后不会记住

更新:对不起,我把这个问题误读为
std::condition\u variable
。毫不奇怪,规范或多或少是相同的:

如果在调用
wait
timed\u wait
时,当前阻止了任何线程等待
*this
,请取消阻止其中一个线程


关于编辑:如果有人调用
push
时没有线程等待,那么调用
pop
的下一个线程根本不会等待,因为
队列不会为空。因此,不需要条件变量记住它不应该等待;该信息存储在正在管理的状态中,而不是条件变量中。如果消费者跟不上生产者,那么你要么加快消费,要么放慢生产;您无法对信号机制进行任何操作来帮助实现这一点。

简而言之:不,它不堆叠


notify_one()
只有在另一个线程正在等待cond_var
时才有效。因此,如果您的消费者正在等待,则第一个
notify_one()
已解锁消费者。第二次
notify\u one()
没有效果,因为没有线程在
条件变量上等待

感谢更新-就像您所说的,第二次在
周围。wait
永远不会被调用,因为队列不是空的。啊!