如何检查libxml2是否已初始化

时间:2017-01-17 05:41:46

标签: c multithreading unix libxml2

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

我找不到函数或方法来检查解析器(或者我应该说libxml2)是否已初始化。我该怎么办?无论如何调用函数并希望最好?我打算测试这个函数是否可以重入,在我发布之后但是这并不是真的。

为了澄清,总结:

  • xmlInitParser()实际上是可重入的吗?
  • 检查libxml2是否已初始化的任何方法?
  • (OR)如何在另一个软件可以同时使用它的前提下同时安全地使用libxml2。

1 个答案:

答案 0 :(得分: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,所以你有自己的私人副本,其他库不能干扰。