Thread und Mutex

Hi !

Mal folgender sinnloser code

Code:
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>
#include <iostream>
#include <vector>

boost::mutex io_mutex; // The iostreams are not guaranteed to be thread-safe!

std::vector<int> vec;

void create_random(void)
{
    int cmp   = 0;
    for(int i = 0; i < 100; i++)
    {
        int value = rand()%100;
        cmp = 0;
        vec.push_back(value);
        boost::mutex::scoped_lock scoped_lock(io_mutex);
        std::cout<<"random  : "<<value<<std::endl;
        std::cout<<"size    : "<<vec.size()<<std::endl;
        // einfach mal durschlaufen
        // hier blockieren, damit sich size nicht ändern kann
        for(int d = 0; d < vec.size(); d++)
        {
            // falls Wert schon im Vector
            if(vec.at(d) == value)
                // zähler inkrementieren
                cmp++;
        }
        // wie oft kam er vor
        std::cout<<"gezählt : "<<cmp<<std::endl;
    }
}

int main(void)
{
    srand (time(NULL));
    boost::thread t1(&create_random);
    boost::thread t2(&create_random);
    boost::thread t3(&create_random);
    t1.join();
    t2.join();
    t3.join();
    return 0;
}

1 Frage :

Bei der Standardausgabe muss ich ja auch einen Mutex setzen, wie z.B. :

Code:
boost::mutex::scoped_lock scoped_lock(io_mutex);

Wie lange gilt dieser, für alle std::cout innerhalb einer funktion, nur für die nächste Textausgabe ?!

2. Frage :

Wie kann ich einen kleinen/großen Bereich vor anderen Threads weil ich bei :

Code:
 for(int d = 0; d < vec.size(); d++)
        {
            // falls Wert schon im Vector
            if(vec.at(d) == value)
                // zähler inkrementieren
                cmp++;
        }
        // wie oft kam er vor
        std::cout<<"gezählt : "<<cmp<<std::endl;

So etwas machen müsste, hätte ich 30 oder 40 Threads, so würde er vielleicht nie ( okay, ziemlich spät ) aus der Schleife kommen, weil sich vec.size() ja immer ändert ( +1 ). Ich will den vector aber nur kurz für den Thread sperren, er soll den vector durchlaufen und ihn wieder freigeben ?

3 Frage :

Muss man eigentlich bei boost einen Mutex nicht freigeben ( laut Doku nicht ), was mich wieder zur Frage 2 führt, wie lange ich ein mutex "gültig"

THX
 
Zurück
Oben