プロデューサ/コンシューマの問題を実装するコードレビュースタックエクスチェンジでは、codeが見つかりました。私はここにコードのセクションを掲示しています。与えられたコードで同じmutexで使用される2つのstd :: unique_lockがデッドロックを引き起こしますか?
、プロデューサーはvoid add(int num)
を呼び出して値を生成する場合のシナリオを考えてみましょう、これはプロデューサーが原因条件変数cond
に待ちキューに行かせるミューテックスmu
のロックを取得し、buffer.size()==size_
。
同じ瞬間に、コンテキストスイッチが行われ、消費者の呼び出しは値を消費する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;
}
}
待ち条件が満たされるまで、ロックを解除し、 ' –
待機を終了する前にそれを再取得する必要がありながら、(真){...; return;} '...なぜループを使うのですか? – Jarod42