2010.12.03 00:16 책 정리/Modern C++ Design
이 포스트의 목적
  • 마이어스 싱글턴(Singleton)의 한계와 개선점을 정리하기 위해서 작성했다.

이 포스트의 준비물

  • Firefox 4.0 b7 - 이제 쓸만해 졌다.

참조 링크

참조 서적

  • 안드레 알렉산드레스쿠 저. Modern C++ Design. 이기형 역.
    Addiston-Wesley. 인포북. 초판 2003.07.30. page(229~232)

내용

마이어스 싱글턴은 6장-2 에서 싱글턴(singleton) 객체의 파괴가 보장 되는 방법으로 소개된 싱글턴(singleton)이다. 이 싱글턴(singleton)의 한계는 다음의 상황에서 확인할 수 있다.

상황

  • 로그 객체, 키보드 객체, 모니터 객체가 존재하며, 마이어스 싱글턴(singleton)으로 구성시킨다.

  • (1)키보드 객체를 생성하고, 모니터 객체를 생성 하는 중, 실패하여, (2)로그 객체를 생성하여 로그를 찍었다.

  • 그리고 프로그램이 종료 작업에 들어 가게 된다.
  • ...

  • (1)키보드 객체를 파괴할 때, 실패하여, (2)로그 객체를 이용해 로그를 찍으려 한다.
  • 하지만, 로그 객체는 이미 파괴된 후이므로, 쭉정이 싱글턴에 접근하게 되어, 크래쉬(Crash)가 발생하게 된다.

보다 직접적으로 말하면, 마이어스 싱글턴(singleton)은 static 을 이용하기 때문에, 스택 형태로 메모리에 올라와져 있어, 키보드 객체가 파괴되기전 로그 객체 부터 파괴한다. 왜냐하면 로그 객체가 키보드 객체 후에 만들어졌기 때문이다.

이처럼 마이어스 싱글턴(singleton)은 이러한 상황에 대처하지 못한다. 자.. 이제 이러한 쭉정이 싱글턴(singleton)으로 인해, 논리적 쇼크가 예상되는 이 현상에 매달리게 되었다.

마이어스 싱글턴(singleton)에서 생기는 쭉정이 싱글턴(singleton) 대처 방법

  • 피닉스(Phoenix) 싱글턴(singleton)을 사용한다.
    파괴된 싱글턴이 요청에 의해 다시 생성되는 싱글턴을 뜻한다.

  • 수명제어 싱글턴(singleton)을 사용한다.
    싱글턴의 파괴 시점 조작할 수 있는 싱글턴을 뜻한다.

여담

  • 해제 안하는 싱글턴은 제외한다. 이 문제는 해제를 하는 전제이기 때문이다.
  • 이 문제는 스마트 포인터로 해결할 수 없다. 스마트 포인터를 static에 올릴 것이기 때문이다.
  • 다음 포스트에서 피닉스 싱글턴과 수명제어 싱글턴의 구현에 대해서 다룬다.


저작자 표시
신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요