2011-01-17 5 views
1

mit so einfachen KlasseBoost-Mutex um

class mySafeData 
{ 
public: 
    mySafeData() : myData(0) 
    { 
    } 

void Set(int i) 
    { 
    boost::mutex::scoped_lock lock(myMutex); 
    myData = i; // set the data 
    ++stateCounter; // some int to track state chages 
    myCondvar.notify_all(); // notify all readers 
    } 

    void Get(int& i) 
    { 
    boost::mutex::scoped_lock lock(myMutex); 
    // copy the current state 
    int cState = stateCounter; 
    // waits for a notification and change of state 
    while (stateCounter == cState) 
     myCondvar.wait(lock); 
    } 
private: 
    int myData; 
    int stateCounter; 
    boost::mutex myMutex; 
}; 

und Anordnung von Fäden in Endlosschleifen ruft jede eine Funktion

Get() 
Set() 
Get() 
Get() 
Get() 

werden sie immer Funktionen in der gleichen Reihenfolge aufrufen und nur einmal pro Kreis (by circle Ich meine, werden alle Boost-Threads in der gleichen Reihenfolge jedes Mal so laufen, dass jeder Thread würde Get() nur einmal nach einem Set())?

Antwort

2

Die Threads sollten das Schloss in der gleichen Reihenfolge erhalten, dass sie den scoped_lock Konstruktor erreichen (glaube ich). Aber es gibt keine Garantie, dass sie diesen Punkt in einer bestimmten Reihenfolge erreichen werden!

Also im Allgemeinen: Verlasse dich nicht darauf.

5

Nein. Sie können niemals Annahmen treffen, in welcher Reihenfolge die Threads bedient werden. Dies ist nichts im Zusammenhang mit Boost, es ist die Grundlagen der Multiprogrammierung.

1

Nein, der Mutex verhindert nur, dass zwei Threads gleichzeitig auf die Variable zugreifen. Es hat keine Auswirkungen auf die Thread-Ablaufsteuerungsreihenfolge oder Ausführungszeit, die in jeder Hinsicht als zufällig angenommen werden können.