我發現這個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