Utilisation de la variable de condition dans une situation producteur-consommateur

J’essaie de mieux comprendre les variables de condition et comment les utiliser dans une situation de producteur à consommateur. J’ai une queue où un thread pousse des numéros dans la queue tandis qu’un autre thread saute des numéros de la queue. Je souhaite utiliser la variable de condition pour signaler le thread consommateur lorsqu’il y a des données placées par le thread producteur. Le problème est qu’il y a des moments (ou la plupart du temps) où il ne pousse que deux éléments dans la queue avant de se bloquer. J’ai indiqué dans la fonction produire () où il s’arrête lors de l’exécution en mode débogage. Quelqu’un peut-il m’aider à préciser pourquoi cela se produit?

J’ai les variables globales suivantes:

boost::mutex mutexQ; // mutex protecting the queue boost::mutex mutexCond; // mutex for the condition variable boost::condition_variable condQ; 

Ci-dessous mon fil de consommation:

 void consume() { while( !bStop ) // globally declared, stops when ESC key is pressed { boost::unique_lock lock( mutexCond ); while( !bDataReady ) { condQ.wait( lock ); } // Process data if( !messageQ.empty() ) { boost::mutex::scoped_lock lock( mutexQ ); ssortingng s = messageQ.front(); messageQ.pop(); } } } 

Ci-dessous mon fil de producteur:

 void produce() { int i = 0; while(( !bStop ) && ( i < MESSAGE )) // MESSAGE currently set to 10 { stringstream out; out << i; string s = out.str(); boost::mutex::scoped_lock lock( mutexQ ); messageQ.push( s ); i++; { boost::lock_guard lock( mutexCond ); // HANGS here bDataReady = true; } condQ.notify_one(); } } 

Vous devez utiliser le même mutex pour protéger la queue que vous utilisez dans la variable de condition.

Cela devrait être tout ce dont vous avez besoin:

 void consume() { while( !bStop ) { boost::scoped_lock lock( mutexQ); // Process data while( messageQ.empty() ) // while - to guard agains spurious wakeups { condQ.wait( lock ); } ssortingng s = messageQ.front(); messageQ.pop(); } } void produce() { int i = 0; while(( !bStop ) && ( i < MESSAGE )) { stringstream out; out << i; string s = out.str(); boost::mutex::scoped_lock lock( mutexQ ); messageQ.push( s ); i++; condQ.notify_one(); } }