여기서 촬영 : 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);