Singleton Pattern
1. 정의
: 클래스에서 만들 수 있는 인스턴스가 오직 하나일 경우에 이에 대한 접근은 어디에서든지 하나로만 통일하여 제공한다.
2. 기본형
: 기본형의 문제는 Thread Safe 하지 않다는 것이다.
: Multi-Thread 환경에서 Race Condition이 발생할 수 있다.
3. Double-Checked Locking Pattern (DCLP)
: 해제는 제외.
: 두 번의 체크와 락을 통해서 Thread 안정성을 확보 한다.
4. Using C++11 Atomic (Acquire and Release Fences)
- Atomic Class
: 정수형 또는 포인터 타입에 대해 산술 연산들을 atomic하게 수행할 수 있도록 해주는 템플릿 클래스.
: 이전 atomic 연산을 위해서는 volatile 변수와 interlocked 계열 함수를 일일이 사용해 주어야 했다.
: Atomic 클래스가 C++ 11 표준으로 오면서 std::atomic 클래스로 앞선 번거로움을 탈피할 수 있게 되었으며, vs2012부터 사용가능 해졌다.
- 사용 이유
: 앞서 설명한 DCLP(double checking lock pattern)은 안전해 보이나 멀티 코어(cpu), 멀티 Thread 환경에서 안전하지 않을 수 있다.
: 이유인 즉, 메모리 가시성(Memory Visibility)이 문제가 될 수 있다.
: 가시성을 해결하는 Memory Barrier (or Fence)방법으로 해결 할 수 있다.
<수행 플로우>
- 사실 fence는 atomic class나 atomic intrinsic 함수를 사용한다면 굳이 사용할 필요가 없다.
: Atomic Class의 모든 기능들은 인자로 memory_order를 받을 수 있으나, 특별히 지정하지 않을 경우, 기본적으로 memory_order_seq_cst가 적용된다.
: 즉, sequential consistency를 보장한다.
: Memory_order을 지정하지 않더라도 모든 Thread에서 memory visibility가 보장되며, 기본적으로 적용되는 memory_order_seq_cst는 memory re-ordering 까지 막아준다.
- 변경 안
5. 추가적인 이야기
- Singleton을 왜 사용하는가?
: Single Thread 환경에서 singleton을 사용할 필요가....
- 논란이 있는 이야기
: Singleton vs Static Class
'Design Pattern' 카테고리의 다른 글
[Design pattern] DECORATOR (0) | 2013.02.25 |
---|---|
[Design pattern] 반복자 Iterator (0) | 2013.02.25 |
[Design pattern] 복합체 Composite (0) | 2013.02.25 |
[Design pattern] 감시자 Observer (0) | 2013.02.25 |
[Design pattern] Bridge (0) | 2013.02.21 |