2012-09-19 4 views
0

싱글 톤을 포함하는 정적 라이브러리가 있습니다. 테스트를 위해 동일한 프로세스에서 이러한 싱글 톤의 개별 인스턴스를로드해야합니다.DLL에 두 번째 싱글 톤 인스턴스를 만들 수 있습니까?

그래서 동일한 정적 라이브러리를 링크하는 DLL을 만든 다음 주 프로세스가 해당 DLL을로드합니다.

DLL이로드하려고하면 싱글 톤에서 정적 인스턴스 포인터에 액세스하려고 할 때 액세스 위반이 발생합니다.

내가 읽은 일부 게시물은 불가능하다는 것과 두 번째 프로세스가 필요하다고 말하지만 다른 사람들은 각 DLL이 링크 된 정적 라이브러리의 모든 정적 변수의 복사본을 얻는다 고 말하면서 이것이 작동해야한다고 제안합니다 ..

나는 무엇을 할 수 있습니까?

+0

액세스 위반을 제공하는 관련 코드를 표시 할 수 있습니까? "DLL이로드하려고하자마자"라고 말하면 얼마나 빨리 나타 납니까? – paddy

+0

마크가 맞았습니다. 그의 게시물 아래에있는 주석을보십시오. – bitwise

답변

3

대부분의 경우 싱글 톤은 실제로 단 한 가지 일뿐입니다. 요청한 내용은 드문 경우입니다.

정적 라이브러리를 DLL에 연결하면 정적 변수가 여러 개 나타날 수 있다는 것을 알고 있습니다. 왜냐하면 직접 본 적이 있기 때문입니다. 각 DLL 또는 EXE는 링커를 통해 정적 라이브러리의 자체 복사본을 가져 와서 정적 변수의 자체 복사본을 가져옵니다.

초기화 위반 문제로 인해 액세스 위반이 발생할 수 있습니다. 제어하는 가장 좋은 방법은 정적 변수가 전역 변수가 아닌 JIT (Just-in-time)를 초기화하는 함수 내에 있는지 확인하는 것입니다.

+0

또는 libs는 뮤텍스, 이벤트 등의 명명 된 시스템 리소스를 할당/사용하고 있으며 프로세스에서 서로 밟고 있습니다. 이것은 '관련'정적 라이브러리가 단일 프로세스 주소 공간에서 중복되는 경우 매우 자주 발생합니다. – WhozCraig

+0

@Mark : 초기화 명령 문제에 대해 당신이 옳았습니다. 요청에 따라 싱글 톤을 인스턴스화하기 위해 DLL로 바뀌었고 더 이상 액세스 위반이 발생하지 않았지만 이제는 두 인스턴스 포인터가 모두 같은 개체를 가리키고 있습니다. 나는 왜 그들이 각각 자신의 사본을 얻지 않는지 이해하지 못한다. – bitwise

+0

사실, 알겠습니다. DLL에서 싱글 톤을 검색 한 후 주 프로세스의 번역 단위 중 하나에서 해당 단일 개체에 대해 GetInstance()를 호출하면 주 프로세스에서 단일 개체의 인스턴스 포인터가 생성됩니다. 그러나 DLL의 번역 단위 중 하나에서 GetInstance()를 호출하는 DLL에서 함수를 내보낼 때 고유 한 포인터가 생깁니다. 도움 주셔서 감사합니다 =) – bitwise