我在 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
我想,这个问题揭示了我对共享库内部工作的有限了解......感谢您的帮助!
xmlInitParser
xmlInitParser
是线程安全的。但是 libxml2 会在内部指定第一个调用该函数的线程为“主线程”。最好在生成其他线程之前从主线程调用一次此函数,例如,在 main
. 的开头
如果进程的任何线程随后调用任何其他 libxml2 函数,则绝不能调用xmlCleanupParser
。所以 xmlInitParser() ... xmlCleanupParser()
在线程级别上是不行的。您通常根本不需要调用 xmlCleanupParser
,但是在使用 valgrind 或 ASan 等工具检查内存泄漏时,您需要它来避免误报。在这种情况下,最好在进程退出之前调用它,例如在 main
结束时。如今,xmlCleanupParser
会在大多数平台上卸载 libxml2 时自动调用。