2010-08-06 67 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

回答

相关问题