"아이 하나만 낳 아 요" - 디자인 모델 중의 단일 모델

"아이 하나만 낳 기" - 디자인 모델 의 단일 모드 (Singleton)
4. 567917. 머리말 은 81955 ° 81955 ° 사람들 에 게 단일 모델 이 무엇 인지 물 었 는데 갑자기 대답 하지 못 해 기억 에 남지 않 는 것 같다.돌아 가서 수업 을 보충 해 보 니 프로젝트 에서 계속 사용 하 던 로그 모듈 은 하나의 예 모드 를 사 용 했 을 뿐 묵 과 했 을 뿐 의식 하지 못 했 을 뿐 이라는 것 을 깨 달 았 다.예 를 들 어 하나의 인 스 턴 스 (Instance) 만 있 고 외부 에 이 인 스 턴 스 를 방문 하 는 전체 방문 점 을 제공 하 는 것 을 말한다.* 8195: 8195: 보통 우 리 는 전체 변 수 를 사용 하여 '아이 하나만 낳 기' 를 실현 할 수 있 지만 더 좋 은 방법 은 이런 자신 이 이 를 만 들 고 보존 하 는 유일한 인 스 턴 스 를 만 드 는 것 이다.이 종 류 는 다른 인 스 턴 스 가 생 성 되 지 않 고 이 인 스 턴 스 를 방문 하 는 방법 을 제공 할 수 있 습 니 다.다음은 구체 적 인 실현 을 살 펴 보 자
4. 567917. 단일 모드 는 8195 ℃ 에서 하나의 Singleton 류 를 정의 하고 정적 방법 GetInstance 를 추가 하여 자신의 유일한 인 스 턴 스 를 만 들 고 클 라 이언 트 가 방문 할 수 있 도록 합 니 다
class Singleton  
{  
private:  
    Singleton()  
    {  
    }  
    static Singleton *m_pInstance;  

public:  
    static Singleton * GetInstance()  
    {  
        if(m_pInstance == NULL)  //    , new      。 
                m_pInstance = new Singleton();  
        return m_pInstance;  
    }

    //             
    void DoWork()
    {
        printf("the work is done!");   
    }  
}; 

* 8195: 8195 주의: 구조 함 수 는 private 로 설정 하면 외부 에서 new 연산 자 를 통 해 이 종 류 를 예화 할 수 없습니다.클 라 이언 트 접근 방법:
Singleton* p1 = Singleton :: GetInstance();
Singleton* p2 = p1->GetInstance();
Singleton & ref = * Singleton :: GetInstance();

p1->DoWork();
p2->DoWork();
ref.DoWork();
Singleton :: GetInstance()->DoWork();

4. 567917. 문제 토론 다 중 스 레 드 환경 에서 여러 스 레 드 가 Singleton 류 의 GetInstance 방법 을 동시에 방문 하면 여러 개의 인 스 턴 스 를 만 들 수 있 습 니 다.따라서 잠 금 보 호 를 해 야 합 니 다. lock 체 제 를 사용 하여 하나의 스 레 드 가 코드 의 임계 구역 에 있 을 때 다른 스 레 드 가 방문 하면 차단 되 어 기다 릴 수 있 고 임계 구역 에 들 어가 지 않도록 해 야 합 니 다.이렇게 실현 할 수 있다.
class Singleton  
{  
private:  
    Singleton()  
    {  
    }  
    static Singleton *m_pInstance;
    CCriticalSection m_cs;   //         
public:  
    static Singleton * GetInstance()  
    {  
        if(NULL == m_pInstance)  //    , new      。 
        {
            lock(m_cs)         //               
          {
              if(NULL == m_pInstance) //    
              {
                     m_pInstance = new Singleton();  
              }  
          }
        }
        return m_pInstance;  
    }

    //             
    void DoWork()
    {
        printf("the work is done!");   
    }  
}; 

왜 2 차 판단 을 해 야 합 니까?    제1차 NULL = = mpInstance 판단 은 매번 자 물 쇠 를 채 워 효율 을 높이 는 것 을 피하 기 위 한 것 이다.    두 번 째 판단 은 인 스 턴 스 가 생 성 되 지 않 으 면 두 스 레 드 가 동시에 1 층 NULL = m 를 통과 하기 때 문 입 니 다.pInstance 는 lock 체제 로 인해 첫 번 째 스 레 드 만 들 어 오고 다른 줄 을 서서 기다 리 고 있 습 니 다. 첫 번 째 스 레 드 가 인 스 턴 스 를 만 들 고 나 오 면 두 번 째 스 레 드 가 들 어간 후에 도 새로운 인 스 턴 스 를 만 들 수 있 습 니 다.
    이 를 통 해 알 수 있 듯 이: 한 아이 만 낳 을 수 있 도록 항상 유의 해 야 합 니 다. 곳곳에 주의 하 세 요. 안전 조 치 는 절대적 으로 보장 해 야 합 니 다. O (∩ ∩) O.
저작권 성명: 본 고 는 csdn 블 로 거 [applebite] (http://blog.csdn.net/applebite) 오리지널 글 은 전재 할 때 출처 를 밝 히 고 권리 침 해 는 반드시 추궁 해 야 한다.위 챗 공식 번호 추가: qichuang 또는 엽기 혁신 플랫폼

좋은 웹페이지 즐겨찾기