0

我正在使用 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 可以使用死指针调用错误回调吗?

任何帮助,将不胜感激。谢谢你。

4

1 回答 1

2

看了源码之后:

首先检查 libxml 是否使用 LIBXML_THREAD_ENABLED 编译。你可以检查一下xmllint -version,它应该说:compiled with: Threads ...

xmlSetGenericErrorFunc(来自 error.c)集合xmlGenericError(在 globals.h 中定义),它(如果启用线程)被声明为xmlGlobalState结构的一部分。

现在xmlGetGlobalState文档清楚地指出,为每个线程单独维护状态。

所以理论上线程不会相互影响,你应该观察到在一个线程中设置错误处理程序不会改变另一个线程的行为。看来你是安全的。

于 2012-10-24T18:59:17.427 回答