Usando variável de condição em uma situação produtor-consumidor
Estou tentando aprender sobre variáveis de condição e como usá-lo em uma situação produtor-consumidor. Eu tenho uma fila em que um segmento empurra números para a fila, enquanto outro segmento aparece números da fila. Eu quero usar a variável de condição para sinalizar o segmento consumidor quando houver alguns dados colocados pelo segmento produtor. O problema é que há momentos (ou na maioria das vezes) em que ele apenas empurra até dois itens para a fila e trava. Eu indiquei na função product () onde ele para quando é executado no modo de depuração. Alguém pode me ajudar a explicar por que isso está acontecendo?
Eu tenho as seguintes variáveis globais:
boost::mutex mutexQ; // mutex protecting the queue
boost::mutex mutexCond; // mutex for the condition variable
boost::condition_variable condQ;
Abaixo está o meu segmento de consumidor:
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 );
string s = messageQ.front();
messageQ.pop();
}
}
}
Abaixo está o tópico do meu produtor:
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();
}
}