static
으로 선언 된 파일 범위 이름에는 내부 연결이 있습니다. 내부 연결은 동적 라이브러리가없는 "클래식"연결 모델에서도 다른 번역 단위에서 볼 수 없음을 의미합니다. 통계는 동일한 실행 파일의 다른 번역 단위에서도 보이지 않기 때문에 첨부 된 동적 라이브러리에서 통계가 표시 될 것으로 기대하는 것은 타당하지 않습니다.
외부의 역동적 인 기호를 사용하여 필요한 연결을 달성하는 방법을 생각해야합니다. 아마도 싱글 톤은 단순히 내부 이름을 가질 수 없지만 외부 이름을 가져야합니다.
L은 객체가 정적이기 때문에뿐만 아니라 그 싱글 톤과 스레드 풀 기능을 정의하는 스레드 풀 모듈을 L에 연결했기 때문에 객체의 자체 인스턴스를 만듭니다. 이것은 라이브러리가 링크되는 방법에 따라 외부 이름이있는 객체에서도 발생할 수 있습니다.
스레드 풀 서비스가 상주 할 단일 개체를 선택하고 해당 개체 만 있는지 확인해야합니다. 프로젝트에 이런 종류의 일을 할 수있는 유틸리티 라이브러리가 없습니까?
은 스레드 풀 API를 제공하는 프로그램 실행 파일 P를 모델에 따라야합니다. 이것은 정말로 같은 것입니다. 프로그램 P는 또 다른 동적 객체이며 실제로 스레드 풀 모듈의 라이브러리로 사용되며 스레드 풀 모듈 자체와 다른 공유 객체에 제공됩니다.
스레드 풀 모듈의 위치와 관계없이 정적으로 해당 모듈의 복사본을 다른 개체에 연결하지 않도록하십시오.이 모듈은 한 곳에서 만 존재합니다.
스레드 풀 싱글 톤의 외부 이름이 해당 API의 일부인 경우 (모든 사람이 문서화 된 이름을 알고 직접 사용하여 API 함수에 전역 풀 전달) 해당 이름을 외부로 만들어 헤더 파일에 선언해야합니다 .
싱글 톤이 비공개 인 경우 함수 호출에 암시적인 것처럼 (숨겨진 스레드 풀이 하나뿐입니다.) 또는 액세스를 추상화하는 등의 숨겨진 방법을 고려해야합니다 쓰레드 풀이 존재하지 않는다면 쓰레드 풀을 생성하는 함수 (다소제공)를 쓰거나 이전에 생성 된 쓰레드 풀을 쓰레드에 안전한 방식으로 반환한다.
생각해보십시오. 예를 들어, stdin
및 stdout
에이 문제가 발생하지 않는 이유는 무엇입니까? 모든 라이브러리가 자신의 stdout
스트림을 인스턴스화하지 않고 해당 스트림에서 자신의 fprintf
함수를 호출하지 않는 이유는 무엇입니까? 왜, 분명히, 이러한 것들이 한 곳에서 살기 때문입니다 : C 라이브러리. 그 (것)들의 사본은 다른 장소에서 산다; 다른 곳에서는 동적 기호를 통해 참조로 사용합니다.
출처
2013-02-21 00:43:40
Kaz
싱글 톤 객체의 인스턴스가 여러 개 있습니까? 그 결함을 수정하십시오. –