본문 바로가기

Design Pattern

[Design pattern] Singleton Pattern with C++ 11

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)방법으로 해결 할 수 있다.


<수행 플로우>

-  사실 fenceatomic classatomic 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