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();
    }
}

questionAnswers(1)

yourAnswerToTheQuestion