我在代码审查堆栈交换中找到了这段代码,它实现了生产者-消费者问题。我在这里发布一段代码。
在给定的代码中,让我们考虑一个场景,当生产者通过调用产生一个值时void add(int num)
,它获取了互斥锁mu
, buffer.size()==size_
这使得生产者由于条件变量而进入等待队列cond
。
同时,发生上下文切换,消费者调用函数int remove()
来消费 value ,它试图获取 mutex 上的锁mu
,但是锁之前已经被生产者获取,所以它失败并且永远不会消费 value,从而导致僵局。
我在哪里错了?因为当我运行它时代码似乎可以正常工作,所以调试它并没有帮助我。
谢谢
void add(int num) {
while (true) {
std::unique_lock<std::mutex> locker(mu);
cond.wait(locker, [this](){return buffer_.size() < size_;});
buffer_.push_back(num);
locker.unlock();
cond.notify_all();
return;
}
}
int remove() {
while (true)
{
std::unique_lock<std::mutex> locker(mu);
cond.wait(locker, [this](){return buffer_.size() > 0;});
int back = buffer_.back();
buffer_.pop_back();
locker.unlock();
cond.notify_all();
return back;
}
}