根据有关多线程的this文档,在同时使用库之前必须调用xmlInitParser()
。这是问题所在。我使用libxml2编写了一个库(不是可执行文件),它应该保证并发性。所以我决定在我的库的init函数上调用init函数。但是,the document表示该函数不可重入。因此,如果其他库或链接我的库的程序事先调用该函数,则可能会出现问题。
我找不到函数或方法来检查解析器(或者我应该说libxml2)是否已初始化。我该怎么办?无论如何调用函数并希望最好?我打算测试这个函数是否可以重入,在我发布之后但是这并不是真的。
为了澄清,总结:
xmlInitParser()
实际上是可重入的吗?答案 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,所以你有自己的私人副本,其他库不能干扰。