我发现这个code在代码审查堆栈交换,它实现了生产者 - 消费者问题。我在这里发布一段代码。在同一个互斥量上使用两个std :: unique_lock会导致死锁?
在给定的代码,让我们考虑一个场景时,制片人致电void add(int num)
产生价值,它获取的是互斥锁mu
和buffer.size()==size_
这使得在等待队列中的生产者进入,由于条件变量cond
。
同时发生上下文切换并且消费者调用函数int remove()
消耗值,它尝试获取互斥锁mu
上的锁,但锁由生产者以前已经获取,因此它失败并且永不消耗该值,从而导致死锁。
我在哪里错了?因为代码似乎在我运行时正常工作,调试它并没有帮助我。
感谢
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;
}
}
等待应释放锁定,直到条件满足并在退出等待之前重新获取它 –
'while(true){..;返回;}'...为什么使用循环? – Jarod42