est-ce une bonne utilisation de stimuler les variables de condition?

J'ai écrit le programme suivant pour sinon incrémenter et doublement un compteur(incrément de première) à l'aide de stimuler les variables de condition. Quelqu'un peut-il me dire si c'est la bonne utilisation de stimuler les variables de condition. Il fonctionne correctement. Je ne comprends pas l'utilisation de la serrure dans l'attente de l'appel de fonction. Ce n'condition.attendre(lock)? Par exemple, quelle est l'utilisation des deux l'étendue des verrous dans l'augmentation et de se multiplier dans ce programme. Comment puis-je les éviter?

#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/bind.hpp>
#include <boost/thread/locks.hpp>
#include <boost/thread/condition_variable.hpp>
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;

int counter=0;
boost::mutex m1,m2;
bool incremented=false,multiplied=false;
boost::condition_variable c1,c2;
void Increment()
{
    {
        boost::mutex::scoped_lock lk(m1);
        counter++;
        incremented = true;
        c1.notify_one();

        while(!multiplied)
            c2.wait(lk);
        multiplied=false;

    }   
}
void Multiply()
{
    {
        boost::mutex::scoped_lock lk(m2);
        while(!incremented)
            c1.wait(lk);
        incremented = false;
        counter = counter*2 ;
        multiplied = true;
        c2.notify_one();
    }
}

void IncrementNtimes(int n){

    for(int i=0;i<n;i++){
        Increment();
    }
}

void MultiplyNtimes(int n){

    for(int i=0;i<n;i++){
        Multiply();
    }
}
int main(int argc, char* argv[])
{
    srand ( time(NULL) );

    boost::thread thrd1(boost::bind(&IncrementNtimes,20));
    boost::thread thrd2(boost::bind(&MultiplyNtimes,20));
    thrd1.join();
    thrd2.join();
    cout<<"Main counter is:"<<counter<<endl;
    return 0;
}

OriginalL'auteur Kamal | 2010-01-29