我在 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的
我想,这个问题揭示了我对共享库内部工作的有限了解......感谢您的帮助!
答案 0 :(得分:0)
xmlInitParser
不是线程安全的。最好在产生其他线程之前从主线程调用此函数一次,例如,在main
的开头。
xmlCleanupParser
。所以线程级别的xmlInitParser() ... xmlCleanupParser()
不行。您通常根本不需要调用xmlCleanupParser
,但是在使用valgrind或ASan等工具检查内存泄漏时,您需要它来避免误报。在这种情况下,最好在流程退出之前调用它,例如在main
结束时。