2013-10-25 3 views
1

여기서 촬영 : http://xerces.apache.org/xerces-c/faq-parse-3.html#faq-6스레드 안전성이 향상됩니까?

둘 개 이상의 파서 인스턴스는 프로세스에 존재 는 인스턴스가 외부 동기화없이 동시에 사용될 수있다. 즉, 두 개의 파서와 두 개의 스레드를 포함하는 응용 프로그램에서 하나의 파서가 두 번째 스레드 내에서 실행되는 두 번째 파서 과 동시에 첫 번째 스레드 내에서 실행될 수 있습니다.

그러나 아래의 코드는 QMutex가 주석 처리 될 때마다 실패하고 사용되는 경우마다 실패합니다.

bool reports::validateSchema(QString fileName) 
{ 
    // QMutexLocker lock(&xercesMutex); 
    try 
    { 
     XMLPlatformUtils::Initialize(); 
    } 
    catch(...) 
    { 
     this->throw_report_exception(__FILE__,__LINE__,__TIME__,__DATE__,"reports::validateSchema", 
            "unable to initialize Xerces Plateform"); 
     return false; 
    } 


    const char* const xsd = "full absloute path to .xsd ==> hard written"; 

    XercesDOMParser* parser = new XercesDOMParser(); 

    try 
    { 
     parser->setValidationSchemaFullChecking(true); 
     parser->setDoSchema(true); 
     parser->setDoNamespaces(true); 
     parser->setValidationConstraintFatal(true); 
     parser->setValidationScheme(XercesDOMParser::Val_Auto); 

     ParserErrorHandler errHandler; 
     parser->setErrorHandler(&errHandler); 

     parser->cacheGrammarFromParse(true); 
     parser->loadGrammar(xsd,Grammar::SchemaGrammarType,true); 


     parser->parse(fileName.toStdString().c_str()); 
     std::cout << parser->getErrorCount() << std::endl; 
     if(parser->getErrorCount()!=0) 
     { 
      return false; 
     } 
    } 
    catch (const XMLException& toCatch) 
    { 
     char* message = XMLString::transcode(toCatch.getMessage()); 
     std::cout << "Exception message is: \n" 
       << message << "\n"; 
     XMLString::release(&message); 
     return false; 
    } 
    catch (const DOMException& toCatch) 
    { 
     char* message = XMLString::transcode(toCatch.msg); 
     std::cout << "Exception message is: \n" 
       << message << "\n"; 
     XMLString::release(&message); 
     return false; 
    } 
    catch (...) 
    { 
     std::cout << "Unexpected Exception \n" ; 
     return false; 
    } 

    delete parser; 
    XMLPlatformUtils::Terminate(); 


    return true; 
} 

무엇이 누락 되었습니까?

기능은 수백 번을 실행 얻을하고 어떤 점에서, 나는에서 세그먼트 폴트를 받고 있어요 중 하나

XercesDOMParser* parser = new XercesDOMParser(); 

또는

parser->loadGrammar(xsd,Grammar::SchemaGrammarType,true); 

답변

1

당신이 참조 같은 질문의 대답에서 인용 :

응용 프로그램은 또한 보장하기 위해 필요로하는 XMLPlatformUtils :: 초기화()와 X MLPlatformUtils :: Terminate() 메서드가 동일한 스레드 (일반적으로 초기 스레드 main())에서 호출되거나 응용 프로그램 에서 여러 스레드가 XMLPlatformUtils :: Initialize() 및 XMLPlatformUtils :: Terminate()를 호출하면 적절한 동기화가 수행됩니다. 동시에.