2013-03-07 2 views
0

싱글 톤 소프트웨어 디자인 패턴을 사용하는 상태 엔진이 있습니다. 상태 엔진은 여러 스레드로 액세스 할 수 있습니다. 객체는 프로그램 시작시 주 스레드에서 초기화되며 지연 초기화를 위해 설계되지 않았습니다.휘발성 싱글 톤 멤버?

class CStateEngine final 
{ 
    private: 
     /* Contains the Singleton object */ 
     static CStateEngine* instance; 
    protected: 
     CStateEngine(); 
    public: 
     static CStateEngine* Instance() volatile; // Returns the Singleton instance 
     static void DeleteInstance() volatile; // Deletes the Singleton instance 
} 
+2

'volatile'은 멀티 스레딩을위한 것이 아닙니다. 멤버들을 '휘발성 (volatile)'이라고 표시하면 무엇이 당신에게 줄 것이라고 생각하니? –

+0

@ R.MartinhoFernandes Fencing? 클래스 멤버 내부에서 다른 곳에 잠금을 구현했습니다. 참조 : [link] (http://www.drdobbs.com/cpp/volatile-the-multithreaded-programmers-b/184403766) –

+2

싱글 톤은 멀티 스레드 환경에서 사용하기위한 것이 아닙니다. 키워드를 추가한다고해서 여기에 도움이되지는 않습니다. 당신은'std :: atomic'과 같은 것이 필요할 것입니다; '휘발성 (volatile) '은 완전히 다른 것을합니다 –

답변

4

C++의 volatile 키워드는 다른 언어와 동일하지 않습니다 :

내 질문은이 같은 대중 정적 멤버 휘발성해야한다. C++에서는 컴파일러가 값이 항상 메모리에서 새로 읽혀지고 캐시 된 값이 사용되지 않는다는 것을 확인합니다.

그것은 임베디드 세계와 다른 장소를 사용합니다. 특정 변수에 대해 항상 최신보기를 원하면 volatile으로 표시하십시오.

멀티 스레딩과 아무런 관련이 없습니다.

다중 스레드 환경에서 단일 스레드를 사용하면 안됩니다. 다중 스레드 환경에서 단일 스레드를 사용하면 여러 스레드가 개체에 액세스하려고 할 때 경합이 발생할 수 있기 때문입니다. 프로그램이 지연되고 처음부터 스레드를 사용하여 완전히 패배합니다.

개체를 전달해야하며 필요할 때 새 개체를 만들어야합니다.

그렇게 할 수 없다면 디자인을 검토하십시오.

+1

스레딩과 관련이 있습니다. 변수 값이 한 스레드의 레지스터에 캐시 된 경우 다른 스레드에서 볼 수 없습니다. –

+2

@infact 사실, thread-safe 데이터 액세스를 구성하는 것이고 그렇지 않은 것은 우스꽝스럽게 불완전한 설명입니다. '휘발성'만으로는 충분하지 않으므로 "코드화 된 코드를 쓰레드 세이프 (threadafe safe)"로 사용하지 않을 것입니다. –

+0

다른 기사에서 말하는 내용을 읽었습니다. "항상 객체의 인스턴스를 만들어서 전달하십시오" 아주 간단하게 들리지만, 그들은 어떻게 말하지 않습니다. 어떤 사람들은 "모든 인스턴스 오브젝트를 생성하는 신 오브젝트 만들기"라고 말하지만, 여전히 모든 밟는 부분이이 "신 오브젝트"를 찾는 방법에 대한 문제로 끝납니다. 항상 정적 또는 싱글 톤으로 끝나게됩니다. –