Proud::CSingleton< T > 클래스 템플릿 참조

클래스

class  Holder
 

Public 타입

typedef RefCount< T > PtrType
 

정적 Public 멤버 함수

static _Noinline PtrType GetSharedPtr ()
 
static T & GetUnsafeRef ()
 

상세한 설명

template<typename T>
class Proud::CSingleton< T >

JIT 인스턴싱만 thread safe하게 하는 singleton template

  • JIT 인스턴싱 과정만 CS lock을 해서 thread safe하게 하고, 생성된 이후부터는 thread unsafe하게 한다.
  • 생성만 thread 동기화하고 이후부터는 불필요한 경우, 예컨대 CItemTemplate 등에서 이 객체를 써야 드문 빈도의 서버 다운을 예방 가능.

일반적 용도

  • 이 클래스의 파생 클래스를 만든다. T에는 파생 클래스의 이름을 넣는다.
  • Instance()를 이용해서 싱글톤의 레퍼런스를 얻는다. Instance()를 최초로 호출하면 객체가 인스턴스화된다.
  • 싱글톤간 파괴 순서를 제어하려면 싱글톤의 생성자에서 의존 대상 싱글톤을 한번 접근해주면 된다.

사용예

class A:public CSingleton<A>
{
public:
void Foo();
};
void Aoo()
{
A::Instance().Foo();
}

DLL과 EXE가 같은 Singleton을 쓰고자 하는 경우

  • CSingleton을 DLL이 제공하고 EXE가 그것을 쓰고자 하는 경우에는 본 클래스를 다음과 같이 구현해야 한다. 안그러면 EXE가 쓰는 singleton과 DLL이 쓰는 singleton이 서로 다른 인스턴스로 존재하게 된다.
    class Goofie:protected CSingleton<Goofie> // protected로 선언해서 Instance를 직접 접근하지 못하게 한다.
    {
    public:
    __declspec(dllexport) Goofie& Instance() // CSingleton.Instance()를 오버라이드하되 DLL에서 export되는 함수로 만든다.
    {
    return __super::Instance(); // DLL 모듈 메모리 공간 내에 만들어진 instance를 리턴한다.
    }
    };

만약 싱글톤끼리 파괴 순서를 보장해야 하는 경우, shared pointer 객체를 얻어서 보관함으로써 파괴 순서를 정의할 수 있습니다.

예시 코드

// 싱글톤 클래스입니다.
class MySingleton:public CSingleton<MySingleton>
{
...
Something();
};
// 싱글톤을 접근하는 사용자입니다.
class MyGoo
{
// MyGoo 인스턴스가 존재하는 동안 싱글톤의 생존을 보장하려면 이 멤버를 갖고 있어야 합니다.
// 물론, 싱글톤 접근을 위해 이 멤버를 사용하십시오.
MySingleton::PtrType m_mySingleton;
// 생성자 메서드
User()
{
// 싱글톤 참조 카운트를 증가시키면서, 싱글톤의 생존을 보장시킵니다.
m_mySingleton = MySingleton::GetInstanceAccessor();
}
Foo()
{
...
// 싱글톤을 접근하려면 이미 갖고 있는 싱글톤 스마트포인터 객체를 통해 접근합니다.
m_mySingleton->Something();
}
}