libxml2.so具有线程

时间:2018-04-18 09:30:39

标签: c multithreading shared-libraries libxml2

我在 arm / linux 环境中使用 libxml2 作为共享库来自不同的并行运行进程。官方的例子是一次性流程,其中InitParser()CleanupParser()的处理是微不足道的。

在多个进程使用libxml2的设置中,我不确定如何使用它。

proc1 -thread1-> work -> libxml2.so -> ...
      -thread2-> work -> ...
      -thread3-> work -> work -> libxml2.so -> work -> ...
proc2 -thread1-> wrapper.so -> libxml2.so -> work -> ...
      -thread2-> work -> ...
      -thread3-> wrapper.so -> libxml2.so -> ...

问题

  • 作为一个嵌入式设备,这些流程可以永久运行,因此我无法承受任何内存泄漏。 (我用unittest + valgrind和live-run +内存监视器测试代码。)

  • InitParser()不具有重复性,因此我在讨论InitParser() => ... =>线程级CleanupParser()不正常? (例如proc1 :: thr1 vs. proc1 :: thr3)

    • 这就是为什么我在考虑过程级别的管家 但CleanupParser()中的proc1电话是否会与proc2's libxml2电话互动?
      (它是"通过"共享库?)

InitParser()

  

XML解析器的初始化函数。这是不可重入。如果在多线程程序中使用

,请在之前调用

CleanupParser()

  

它清理库本身分配的内存。这是一个清理   XML库的函数。它试图收回所有相关的全球   为库处理分配的内存。它没有解除任何分配   文件相关记忆。只有当时才应该调用xmlCleanupParser()   流程已完成使用库和所有XML / HTML文档   用它建造。另请参见xmlInitParser(),它具有相反的含义   为操作准备库的功能。警告:如果你的   应用程序是多线程的或有插件支持调用这可能   如果另一个线程或插件仍在使用,则崩溃应用程序   libxml2的

我想,这个问题揭示了我对共享库内部工作的有限了解......感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

xmlInitParser不是线程安全的。最好在产生其他线程之前从主线程调用此函数一次,例如,在main的开头。

如果进程的任何线程之后调用任何其他libxml2函数,则永远不能调用

xmlCleanupParser。所以线程级别的xmlInitParser() ... xmlCleanupParser()不行。您通常根本不需要调用xmlCleanupParser,但是在使用valgrind或ASan等工具检查内存泄漏时,您需要它来避免误报。在这种情况下,最好在流程退出之前调用它,例如在main结束时。