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);
4

1 回答 1

1

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

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

于 2013-10-30T13:20:46.750 回答