2013-10-11 2 views
0
Singleton* Singleton::instance() { 

if (pInstance == 0) { 

    Lock lock; 

    if (pInstance == 0) { 

     Singleton* temp = new Singleton; // initialize to temp 
     pInstance = temp; // assign temp to pInstance 
    } 
    } 

컴파일러가 중복 temp를 최적화하지 않는다고 가정합니다. 스레드 A가 Singleton 개체에 할당되고 구성되며이 개체는 temp에 의해 지정됩니다. 이제 A가 그 직후에 선점됩니다. 이제 스레드 B가 잠금을 가져 와서 안으로 들어가서 pInstance가 NULL인지 확인하십시오. 또한 Singleton 개체를 만들고 기존 포인터를 덮어 씁니다. 나는 지금 메모리 누수가있는 것 같아. 당신의 의견 것입니다 ? 전체 소스 코드는 여기입니다 : 코드 참조 : http://erdani.com/publications/DDJ_Jul_Aug_2004_revised.pdf멀티 스레드 환경에서 싱글 톤으로 구현 된 메모리 누수

+1

다시 연결 한 기사를 읽으십시오. –

답변

1

아니요. A가 인터럽트되면 해당 창은 자물쇠를 소유합니다. 따라서 B는 A가 잠금을 해제 할 때까지 대기해야하지만 pInstance가 할당되고 B에 대한 두 번째 null 검사가 실패합니다. C++에서 11

1

는 표준 6.7 절 것을 규정 : 이러한 변수가 제어 선언 통과 처음 초기화

; 그러한 변수는 초기화 완료시 초기화 된 것으로 간주됩니다. [...] 변수가 초기화되는 동안 컨트롤이 동시에 선언에 들어가면 동시 실행은 초기화 완료를 기다려야합니다.

구현시 이니셜 라이저 실행과 관련하여 교착 상태가 발생해서는 안됩니다.

이 다음과 같은 매우 간단하고 스레드 안전 싱글 메소드 구현에 이르게 :

Singleton* Singleton::instance() { 
    Singleton instance; 
    return &instance; 
} 

이있는이 기능을 지원 컴파일러는 자세한 내용 this question를 참조하십시오.

관련 문제