我使用Libxml2来读/写XML文件。 为了在加载XML时捕获libxml错误,我使用的是xmlSetGenericErrorFunc。
void Myclass::load(const std::string &filename)
{
xmlGenericErrorFunc handler = (xmlGenericErrorFunc) catchErrors;
xmlSetGenericErrorFunc(this, handler); //context pointer, error handler
}
重置上下文和错误处理程序可以完成如下。
xmlSetGenericErrorFunc(NULL, NULL);
我的包装器库被许多进程使用。 Libxml2是一个.so文件。
如果我在错误处理程序中使用上下文指针,如果某些进程在没有重置上下文指针的情况下死亡并且在其他进程中发生解析错误,是否有可能发生崩溃? libxml可以用死指针调用错误回调吗?
任何帮助将不胜感激。谢谢。
答案 0 :(得分:1)
看了一眼来源:
首先检查是否使用LIBXML_THREAD_ENABLED编译了libxml。您可以与xmllint -version
核实,并且应该说:compiled with: Threads ...
xmlSetGenericErrorFunc
(来自error.c)设置xmlGenericError
(在globals.h中定义),其中(如果启用了线程)被声明为xmlGlobalState
结构的一部分。
现在xmlGetGlobalState文档清楚地说明了为每个线程分别维护状态。
因此理论上线程不会相互影响,您应该观察到一个线程中的设置错误处理程序不会改变另一个线程的行为。而且看起来你是安全的。