문제

제품에 사용중인 라이브러리 중 하나는 싱글 톤을 사용하여 액세스 할 수 있습니다. 나는 그것이 정적 인스턴스로 구현되었다고 확신합니다 (오픈 소스가 아님). 이는 단일 문서 응용 프로그램에 적합하지만 앱에는 둘 이상의 문서가로드되었을 수 있습니다. 인스턴스에 대한 액세스가 다음과 같이 작성되었다고 가정합니다.

Instance* getInstance() {
    static Instance* inst = new Instance();
    return inst;
}

이와 같은 상황에서는 둘 이상의 인스턴스를 강력하게 만들 수있는 방법이 있습니까? 내가 생각할 수있는 유일한 것은 프로세스 이상의 IPC를 사용하여 모두 함께 묶는 것입니다. 나는 덜 해킹 된 것을 생각할 수 없다.

나는 공급 업체에게 몇 가지 유형의 세션 토큰을 구현하도록 요청하여 여러 동시 인스턴스를 가질 수 있지만 크고 작습니다.

코리

편집하다:

  • 기계는 Windows 기계입니다
  • 글로벌 정적은 기본적으로 큰 공장입니다. 나는 어떤 유형의 세션 토큰을 원하기 때문에 "이 세션에서 모든 리소스를 릴리스"라고 쉽게 말할 수 있습니다 (내가 알고있는 글로벌 통계를 다시 시작할 수있는 방법은 없습니다).

내가 원하는 것을 얻기 위해 Dodgy Shenanigans를 시도하기보다는 모든 것을 내 수업으로 마무리하고 모든 Getter에 세션 키를 추가 할 것입니다. 내부적으로 할당 된 내용을 추적하겠습니다. 자체 릴리스 방법을 추가하여 리소스를 반환합니다. 이것은 여러 가지 이유로 차선책이지만 더 나은 아이디어를 생각할 수는 없습니다.

훌륭한 피드백에 감사드립니다.

도움이 되었습니까?

해결책

내가 생각할 수있는 유일한 것은 싱글 톤 클래스를 다음과 같이 정의 할만 큼 운이 좋으면 하위 클래스를하는 것입니다.

class Document {
public:
    static Document* getInstance() {
        static Document inst;
        return &inst;
    }
    virtual ~Document();
protected:
    Document();
private:
    struct Impl;
    Impl *pImpl;
};

서브 클래스를 할 수 있고 서브 클래스가 생성자에 액세스 할 수 있다면 초기 서브 클래스와 같은 :

class MyDocument: public Document {
public:
    MyDocument(): Document() {
    }
};

구현자가 불쾌한 가정을했을 수도 있기 때문에 이것은 완전히 안전하지 않을 수 있습니다. 그러나 그것은 일할 기회가있을 수있는 아이디어 나 접근법입니다. 운 좋게도 공급 업체는이 옵션을 언급하면이 옵션에 적합 할 수 있습니다 ... 행운을 빕니다.

다른 팁

모든 일이 진행되는 동안이 특정 문제를 해결할 수 있었음에도 불구하고,이 싱글 톤 문제는 빙산의 일각 일 뿐이라고 걱정할 것입니다. 라이브러리는 분명히 시나리오를 위해 설계되지 않았습니다.

DLL의 각 부하를 자체 프로세스로 분리하는 것은 나에게 옳고 비만적인 소리를 낼 수 있지만, 물론 비용이 많이들 수 있습니다.

불행히도 당신의 추론에서 결함이 보이지 않습니다. 공급 업체는 결정을 내 렸으며 당신은 그것을 결정했습니다. 그는 프로세스 당 하나의 인스턴스를 결정 했으므로 여러 인스턴스를 원한다면 수반되는 모든 프로세스가 있어야합니다.

물론 그의 제한 결정이 임의적이며 그에 대한 이유가 없다고 가정하면 그 주위를 해킹하려고 시도 할 수 있습니다. 그 경로에서 시작하는 방법은 디버거에서 분해/어셈블리 스텝핑을하는 것입니다. 그의 인스턴스 공장이 위에서 결론을 내린대로 정확하게 작동한다는 것을 확인할 수 있다면, 여러 인스턴스를 생성 할 수있는 대안을 해킹 할 수 있습니다.

그러나이 접근법의 큰 위험은 공급 업체의 코드베이스의 모든 코드 라인이 단일 인스턴스를 결정하기로 한 결정에 의존하는 모든 코드 라인이 얼굴에 폭발 할 준비가 된 시간 폭탄이라는 것입니다. 그 코드는 당신에게 보이지 않습니다. 그런 라인이 제로가 있다고 내기 할 준비가 되셨습니까? 나는 클린트 이스트우드가 이와 같은 상황에서 무엇을 말할지 알고있다. "행운의 펑크를 느끼나요? :-)

하나의 프로그램 공간에서 싱글 톤 객체의 여러 인스턴스를 가질 수있는 우아한 방법은 없지만 의도적입니다. 일반적으로 여러 인스턴스를 갖는 것이 바람직하지 않은 경우 싱글 톤 만 사용합니다. 공급 업체가 싱글 톤을 사용하여 제품을 구현 한 경우 선택에 대한 충분한 이유가있을 수 있습니다.

아마도 문제를 더 자세히 설명하면 다른 접근법이있을 수 있습니다. 제공된 정보에 근거하여 말하기는 어렵습니다. 싱글 톤 개체는 무엇을합니까? 여러 인스턴스가 필요한 이유는 무엇입니까?

당신이 제안한 신문적인 것들을 제외하고, 내가 생각할 수있는 가장 좋은 해킹은 dll을 새 파일에 복사하고 새 DLL을 수동으로로드하고 작성한 각 인스턴스에 대해 사용하는 모든 기능을 수동으로로드하는 것입니다.

바라건대 이것은 정적 변수가 기술적으로 동일한 DLL에 있지 않기 때문에 다른 인스턴스간에 충돌하지 않는다는 것을 의미합니다. 그러나이 솔루션에는 DLL의 모든 코드가 각 버전에 대해 복제되는 것과 같이 많은 나쁜 점이 있으며 가져 오기 라이브러리를 사용할 수는 없지만 DLL을로드하고 모든 기능을 수동으로 가져와야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top