2011-01-17 1 views
1

だから、単純なクラスブーストミューテックス順

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

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

彼らは常に円ごとに一度だけ同じ順序で関数を呼び出すとなり、それぞれの機能を呼び出す無限ループ内のスレッドの配列を(持ちますサークルでは、すべてのスレッドが毎回同じ順番で実行されることを意味するので、各スレッドは()の後に1回だけGet()となるでしょうか?

答えて

2

スレッドは、scoped_lockコンストラクタに到達するのと同じ順序でロックを取得する必要があります(私は思う)。しかし、彼らが一定の順序でその点に到達するという保証はありません!

一般的に:それに頼らないでください。

5

いいえスレッドがどの順序で配信されるかは決して想定できません。これはブーストに関係するものではなく、マルチプログラミングの基礎です。

1

いいえ、mutexは、2つのスレッドが同時に変数にアクセスすることを防ぎます。スレッドのスケジューリング順序や実行時間には影響しません。これは、すべての目的と目的でランダムと見なすことができます。