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>
{
public:
__declspec(dllexport) Goofie& Instance()
{
return __super::Instance();
}
};
만약 싱글톤끼리 파괴 순서를 보장해야 하는 경우, shared pointer 객체를 얻어서 보관함으로써 파괴 순서를 정의할 수 있습니다.
예시 코드
class MySingleton:public CSingleton<MySingleton>
{
...
Something();
};
class MyGoo
{
MySingleton::PtrType m_mySingleton;
User()
{
m_mySingleton = MySingleton::GetInstanceAccessor();
}
Foo()
{
...
m_mySingleton->Something();
}
}