【问题标题】:How to check if libxml2 is initialized如何检查 libxml2 是否已初始化
【发布时间】:2017-06-01 01:56:44
【问题描述】:

根据this关于多线程的文档,在并发使用库之前必须调用xmlInitParser()。这就是问题所在。我使用 libxml2 编写了一个库(不是可执行文件),它应该保证并发性。所以我决定在我的库的 init 函数上调用 init 函数。但是,the document 表示该函数不可重入。因此,如果其他库或链接我的库的程序事先调用该函数可能会出现问题。

我找不到检查解析器(或者我应该说是 libxml2)是否已初始化的函数或方法。我该怎么办?不顾一切地调用函数并希望最好?在我发布这个之后,我将测试该函数是否是可重入的,但这并没有真正符合。

为了澄清,总结一下:

  • xmlInitParser() 真的是可重入的吗?
  • 有什么方法可以检查 libxml2 是否已初始化?
  • (或)如何在另一个软件也可以同时使用 libxml2 的前提下安全地同时使用它。

【问题讨论】:

  • 邮件列表似乎不是很活跃,所以我在这里问。
  • 你能在任何线程产生之前在主程序中调用它吗?这就是我记得使用 libxml2 时所做的事情。
  • Nitpick:即使不是可重入的,也可能会被连续调用几次。
  • “可重入”并不是我想的那样。我是多么的无知。

标签: c multithreading unix libxml2


【解决方案1】:

查看源代码(取自here)后,似乎可以多次调用该函数:

static int xmlParserInitialized = 0;

void
xmlInitParser(void) {
    if (xmlParserInitialized != 0)
     return;

 #ifdef LIBXML_THREAD_ENABLED
     __xmlGlobalInitMutexLock();
     if (xmlParserInitialized == 0) {
 #endif
     /* ... the actual initialization ... */
     xmlParserInitialized = 1;
 #ifdef LIBXML_THREAD_ENABLED
     }
     __xmlGlobalInitMutexUnlock();
 #endif
 }

您担心多个其他库同时调用xmlInitParser()。 System V ABI 意味着库是一个接一个地加载的(参见“初始化和终止函数”部分)。
[假设没有其他库创建线程(调用xmlInitParser())]这意味着您不必担心它。

如果你真的想要安全,你应该在你的库中静态链接 libxml,这样你就有了自己的私有副本,其他库无法干扰。

【讨论】:

  • 我不打算同时调用它,但如果启用了线程支持,该函数仍然看起来是线程安全的。我的问题更多是关于哲学而不是技术。当然,文档具有误导性。它没有评论它的真正作用或以某种方式调用是否安全。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
  • 2015-05-23
相关资源
最近更新 更多