자바의 싱글 톤과 C ++의 싱글 톤

user1028741

Java에서는 다음과 같이 Singleton을 만들 수 있습니다 (예외로 throw되지 않는 한).

private static Singleton m_this = new Singleton();

이것은 본질적으로 스레드로부터 안전하기 때문에 매우 편리합니다.

C ++에서 비슷한 작업을 할 수 있습니까?

마틴 J.

스레드로부터 안전한 초기화로 싱글 톤을 만드는 한 가지 방법은 C ++ 11 기준으로 표준에 의해 보장됩니다. is :

class SomeSingleton {
  public:
    static SomeSingleton& instance() {
      static SomeSingleton instance_;
      return instance_;
    }

  private:
  SomeSingleton() {
    ...
  }
};

로컬 정적 변수 초기화는 C ++ 11에서 스레드로부터 안전 하기 때문에 스레드로부터 안전 합니다. 관련 표준 문서 N3485 는 섹션 6.7.4에 다음과 같이 말합니다.

이러한 변수는 처음 제어가 선언을 통과 할 때 초기화됩니다. 이러한 변수는 초기화 완료시 초기화 된 것으로 간주됩니다. [...] 변수가 초기화되는 동안 제어가 선언에 동시에 입력되면 동시 실행은 초기화 완료를 기다려야합니다.

각주 포함 :

구현시 이니셜 라이저 실행에 교착 상태가 발생하지 않아야합니다.

CRTP를 사용하여 멋진 템플릿 기본 클래스로 추상화 할 수 있습니다.

//Singleton template definition
template <typename TDerived>
class Singleton {
  static_assert(is_base_of<Singleton, TDerived>::value, "Singleton: unexpected Derived template parameter");
  public:
    static TDerived& instance() {
      static TDerived instance_;
      return instance_;
    }

  protected:
  Singleton() {
  }
};

// SomeSingleton definition, using the Singleton template
class SomeSingleton : public Singleton<SomeSingleton> {
  ...
};

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사