2013-02-20 1 views
0

dlopen을 사용하여 프로그램 (P)에 의해 동적으로로드되는 라이브러리 (L)가 있습니다. L은 플러그인 인터페이스를 구현하므로 일부 기능을 얻기 위해 부모 인터페이스를 다시 호출합니다. 싱글은 L이 종료로드 될 때, 정적 변수를 사용하여 작동하기 때문에dlopen'd 라이브러리 L에서 프로그램 P의 정적 변수에 어떻게 액세스합니까?

내부 P는 동적 제가

그러나 L.에서 액세스해야 스레드 풀 오브젝트 A. 를 생성하는 단일 목적 그것은 자신의 인스턴스를 creatng 일부 경우 괜찮을 거라고하지만 나는 P에서 만든 인스턴스를 원한다. 거기에 방법이 있나요?

+1

싱글 톤 객체의 인스턴스가 여러 개 있습니까? 그 결함을 수정하십시오. –

답변

1

L에 static A가 없어야합니다. P가 A의 주소를 L로, 즉 L.init(&A)으로 전달합니다.

+0

그리고 그게 내가 그것을 해결할 수 있었던 방법입니다. 건배. – Matt

1

static으로 선언 된 파일 범위 이름에는 내부 연결이 있습니다. 내부 연결은 동적 라이브러리가없는 "클래식"연결 모델에서도 다른 번역 단위에서 볼 수 없음을 의미합니다. 통계는 동일한 실행 파일의 다른 번역 단위에서도 보이지 않기 때문에 첨부 된 동적 라이브러리에서 통계가 표시 될 것으로 기대하는 것은 타당하지 않습니다.

외부의 역동적 인 기호를 사용하여 필요한 연결을 달성하는 방법을 생각해야합니다. 아마도 싱글 톤은 단순히 내부 이름을 가질 수 없지만 외부 이름을 가져야합니다.

L은 객체가 정적이기 때문에뿐만 아니라 그 싱글 톤과 스레드 풀 기능을 정의하는 스레드 풀 모듈을 L에 연결했기 때문에 객체의 자체 인스턴스를 만듭니다. 이것은 라이브러리가 링크되는 방법에 따라 외부 이름이있는 객체에서도 발생할 수 있습니다.

스레드 풀 서비스가 상주 할 단일 개체를 선택하고 해당 개체 만 있는지 확인해야합니다. 프로젝트에 이런 종류의 일을 할 수있는 유틸리티 라이브러리가 없습니까?

은 스레드 풀 API를 제공하는 프로그램 실행 파일 P를 모델에 따라야합니다. 이것은 정말로 같은 것입니다. 프로그램 P는 또 다른 동적 객체이며 실제로 스레드 풀 모듈의 라이브러리로 사용되며 스레드 풀 모듈 자체와 다른 공유 객체에 제공됩니다.

스레드 풀 모듈의 위치와 관계없이 정적으로 해당 모듈의 복사본을 다른 개체에 연결하지 않도록하십시오.이 모듈은 한 곳에서 만 존재합니다.

스레드 풀 싱글 톤의 외부 이름이 해당 API의 일부인 경우 (모든 사람이 문서화 된 이름을 알고 직접 사용하여 API 함수에 전역 풀 전달) 해당 이름을 외부로 만들어 헤더 파일에 선언해야합니다 .

싱글 톤이 비공개 인 경우 함수 호출에 암시적인 것처럼 (숨겨진 스레드 풀이 하나뿐입니다.) 또는 액세스를 추상화하는 등의 숨겨진 방법을 고려해야합니다 쓰레드 풀이 존재하지 않는다면 쓰레드 풀을 생성하는 함수 (다소제공)를 쓰거나 이전에 생성 된 쓰레드 풀을 쓰레드에 안전한 방식으로 반환한다.

생각해보십시오. 예를 들어, stdinstdout에이 문제가 발생하지 않는 이유는 무엇입니까? 모든 라이브러리가 자신의 stdout 스트림을 인스턴스화하지 않고 해당 스트림에서 자신의 fprintf 함수를 호출하지 않는 이유는 무엇입니까? 왜, 분명히, 이러한 것들이 한 곳에서 살기 때문입니다 : C 라이브러리. 그 (것)들의 사본은 다른 장소에서 산다; 다른 곳에서는 동적 기호를 통해 참조로 사용합니다.

관련 문제