2010-08-06 92 views
1

我有一個類,其中一個布爾同時訪問。但是在我的情況下,它只在構造函數中初始化爲false,然後設置爲false。我是否正確地相信即使可能發生競爭,結果將是有效的和定義的?由於整個布爾沒有必要寫入「!isStopping_」以評估爲true。將布爾值設置爲true時需要原子CAS

class MyClass 
{ 
public: 
    MyClass() : isStopping_(false), thread_([=]{Run();}) {} 

    void Stop() 
    { 
     isStopping_ = true; 
    } 

private: 

    void Run() 
    { 
     while(!isStopping_) // data race 
     { 
      // Work 
     } 
    } 

    bool isStopping_ ; 
    boost::thread thread_; 
}; 
+2

只要緩存不阻止未讀新值,那麼它應該是罰款。只需要設置一個位(即使寫入本身並非在所有單詞中都是原子的) - 並且它只能在「共享」狀態下設置爲一種方式。 **更好地將其標記爲volatile(用於緩存/訪問問題)。** – 2010-08-06 17:56:07

+0

是的,關於volatile與MT的問題幾乎每天都會在這裏問到。最近一個:http://stackoverflow.com/questions/3372703/volatile-and-multithreading – Dummy00001 2010-08-06 23:31:34

回答

相關問題