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