C++ Xerces线程安全?

C++ Xerces线程安全?,c++,multithreading,xerces,C++,Multithreading,Xerces,摘自这里: 当一个进程中存在两个或多个解析器实例时,可以使用这些实例 同时,无需外部同步。也就是说,在包含两个 解析器和两个线程,一个解析器可以在第一个线程内与 在第二个线程中运行的第二个解析器 但是下面的代码在QMutex被注释时失败,而在使用它时不会失败 bool reports::validateSchema( QString fileName ) { // QMutexLocker lock( &xercesMutex ); try {

摘自这里:

当一个进程中存在两个或多个解析器实例时,可以使用这些实例 同时,无需外部同步。也就是说,在包含两个 解析器和两个线程,一个解析器可以在第一个线程内与 在第二个线程中运行的第二个解析器

但是下面的代码在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;
}


引用您提到的同一常见问题解答:

应用程序还需要保证XMLPlatformUtils::Initialize()和 XMLPlatformUtils::Terminate()方法是从同一线程(通常是 应用程序执行执行main()的初始线程或正确的同步 如果多个线程调用XMLPlatformUtils::Initialize()和XMLPlatformUtils::Terminate() 同时


引用您提到的同一常见问题解答:

应用程序还需要保证XMLPlatformUtils::Initialize()和 XMLPlatformUtils::Terminate()方法是从同一线程(通常是 应用程序执行执行main()的初始线程或正确的同步 如果多个线程调用XMLPlatformUtils::Initialize()和XMLPlatformUtils::Terminate() 同时

XercesDOMParser* parser = new XercesDOMParser();
parser->loadGrammar(xsd,Grammar::SchemaGrammarType,true);