J'ai trouvé ce code sur l'échange de pile de revue de code qui implémente un problème producteur-consommateur. Je poste une section de code ici.Deux std :: unique_lock utilisé sur le même mutex provoque un blocage?
Dans le code donné, considérons un scénario quand le producteur produit une valeur en appelant void add(int num)
, il acquiert verrou sur mutex mu
et buffer.size()==size_
ce qui rend le producteur continuer file d'attente en raison de la variable cond
conditionnelle.
Au même moment, un changement de contexte a lieu et les appels des consommateurs fonctionnent int remove()
à consommer la valeur, il tente d'acquérir le verrou sur mutex mu
, mais le verrou a déjà été acquis précédemment par le producteur de sorte qu'il échoue et ne consomme la valeur, provoquant ainsi une impasse.
Où est-ce que je me trompe ici? Parce que le code semble fonctionner correctement lorsque je l'exécute, le débogage ne m'a pas aidé.
Merci
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;
}
}
wait devrait libérer le verrou jusqu'à ce que la condition soit remplie et le réacquérir avant de quitter attendre –
'while (true) {..; retour;} '... pourquoi utiliser une boucle? – Jarod42