2017-01-17 9 views
2

멀티 스레딩에 대한 this 문서에 따르면 라이브러리를 동시에 사용하기 전에 xmlInitParser()을 호출해야합니다. 여기에 문제가 있습니다. libxml2를 사용하여 라이브러리 (실행 파일이 아님)를 코딩했고 동시성을 보장해야합니다. 그래서 우리 라이브러리의 init 함수에서 init 함수를 호출하기로 결정했습니다. 그러나 the document 함수는 재진입 성이 없다고 말합니다. 따라서 다른 라이브러리 나 내 라이브러리를 연결하는 프로그램이 미리 함수를 호출하면 문제가 될 수 있습니다.libxml2가 초기화되었는지 확인하는 방법

파서 (또는 libxml2)가 초기화되어야하는지 확인하는 기능이나 방법을 찾을 수 없습니다. 어떻게해야합니까? 관계없이 함수를 호출하고 최선의 결과를 얻으시겠습니까? 결국 함수가 재진입 적이라는 것을 테스트 할 것입니다.하지만이 함수를 게시 한 후에는 실제로 계산되지 않습니다. 요약에 대한 명확한

:

  • xmlInitParser() 실제로 재진입?
  • libxml2가 초기화되었는지 확인하는 방법은 무엇입니까?
  • (OR) libxml2를 다른 소프트웨어가 동시에 사용할 수 있다는 전제하에 안전하게 사용하는 방법.
+0

메일 링리스트가 활성화되지 않은 것처럼 보였으므로 여기에서 요청합니다. –

+0

스레드가 생성되기 전에 메인 루틴에서 호출 할 수 있습니까? 그게 내가 libxml2를 사용할 때했던 일이다. – bruceg

+0

Nitpick : 재진입 성이 아니더라도 계속해서 여러 번 호출 될 수 있습니다. – user45891

답변

0

(here에서 촬영)에 소스 코드보고 후에 함수를 여러 번 호출 할 수 보인다

static int xmlParserInitialized = 0; 

void 
xmlInitParser(void) { 
    if (xmlParserInitialized != 0) 
    return; 

#ifdef LIBXML_THREAD_ENABLED 
    __xmlGlobalInitMutexLock(); 
    if (xmlParserInitialized == 0) { 
#endif 
    /* ... the actual initialization ... */ 
    xmlParserInitialized = 1; 
#ifdef LIBXML_THREAD_ENABLED 
    } 
    __xmlGlobalInitMutexUnlock(); 
#endif 
} 

당신은 동시에 xmlInitParser()를 호출하는 여러 다른 라이브러리에 대해 우려하고있다. System V ABI는 라이브러리가 차례로로드된다는 것을 의미합니다 ("초기화 및 종료 함수"절 참조).
[다른 라이브러리가 스레드 (즉, xmlInitParser()을 호출합니다)를 생성하지 않는다고 가정하면] 걱정할 필요가 없습니다.

정말로 안전하려면 라이브러리에 libxml을 정적으로 연결해야하므로 다른 라이브러리가 방해 할 수없는 개인적인 복사본이 있어야합니다.

+0

동시에 호출 할 계획은 없지만 스레드 지원이 활성화되어 있으면 함수는 스레드 안전성을 유지합니다. 제 질문은 기술적 인 것보다 철학적 인 것이 었습니다. 확실히 설명서는 오도 된 것입니다. 실제로하는 일이나 어떤 방식으로 부름을하는 것이 안전한지는 논평하지 않습니다. –