libxml2.so Init/CleanupParser 用于多线程进程

问题描述 投票:0回答:1

我在 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+memory monitor 来测试代码)

  • InitParser()
    不是可重入的,所以我理解
    InitParser()
    => ... =>
    CleanupParser()
    在线程级别上不行吗? (例如 proc1::thr1 与 proc1::thr3)

    • 这就是为什么我正在考虑流程级别的内部管理。
      但是
      CleanupParser()
      中的
      proc1
      调用会与
      proc2's
      libxml2 调用交互吗?

      (它是“通过”共享库“隧道化”的吗?)

InitParser()

XML 解析器的初始化函数。这是不可重入。在多线程程序中使用时调用一次before处理

CleanupParser()

它清理库本身分配的内存。这是一个清理 XML 库的函数。它试图回收所有相关的全局 为库处理分配的内存。它不释放任何 文档相关内存。只有当 该过程已完成 使用库和所有 XML/HTML 文档 用它建造。另请参阅 xmlInitParser() ,它具有相反的内容 为操作准备库的功能。警告:如果您的 应用程序是多线程的或有插件支持调用这可能 如果另一个线程或插件仍在使用,则使应用程序崩溃 libxml2

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

c multithreading shared-libraries libxml2
1个回答
1
投票

xmlInitParser
不是线程安全的。 如今,
xmlInitParser
是线程安全的。但是 libxml2 会在内部指定第一个调用该函数的线程为“主线程”。最好在生成其他线程之前从主线程调用一次此函数,例如,在
main
.

的开头 如果进程的任何线程随后调用任何其他 libxml2 函数,则绝不能调用

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

© www.soinside.com 2019 - 2024. All rights reserved.