2010-08-06 3 views
1

부울이 동시에 액세스하는 클래스가 있습니다. 그러나 내 경우에는 생성자에서 한 번만 false로 초기화되고 그 후에는 false로 설정됩니다. 경주가 발생할지라도 그 결과가 유효하고 정의 될 것이라고 믿는 것이 맞습니까? true로 평가하려면 "! isStopping_"에 대한 inorder에 bool 전체를 써야 할 필요가 없기 때문입니다.부울을 참으로 설정할 때 원자 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

만큼 캐시가 후하지 읽기 - 새로운 값을 방지하지 않습니다이 잘되어야한다. 쓰기 자체가 모든 단어에 걸쳐 원자가 아닐지라도 한 비트 만 설정하면됩니다. 그리고 "공유"상태에서 한 방향으로 만 설정됩니다. ** 휘발성 (캐시/액세스 문제의 경우)을 표시하는 것이 좋습니다. ** –

+0

예, 휘발성 대 MT에 대한 질문은 매일 여기에서 많이 묻습니다. 최근 버전 : http://stackoverflow.com/questions/3372703/volatile-and-multithreading – Dummy00001

답변

관련 문제