我希望支持将SVG图像渲染为Bitmaps,我正在使用librsvg。到目前为止它运作良好,并使用开罗,万岁!但是我遇到了一个问题:
我们有一个类似于Windows资源管理器的控件,例如它会在目录中创建缩略图大小的文件图像,因此产品将被扩展为生成SVG的缩略图。
它使用后台线程生成缩略图图像,因此UI不会因其工作而被冻结。代码已经生产了很长时间,因此并发问题就没有问题了。但似乎从主线程以外的线程调用rsvg_handle_new()时会发生访问冲突,而不是我使用librsvg时没有问题。
查看堆栈跟踪崩溃似乎发生在xmlSetGlobalState()的libxml2(librsvg的依赖关系)中,问题似乎与此处报告的libxml2 crash on second use on Windows相同,但似乎没有解析度。我会限制我对主线程的使用仅限于我可以,但我坚持使用现有的架构,它会在主线程中产生缩略图。
我发现http://www.xmlsoft.org/threads.html建议首先在主线程中调用xmlInitParser(),这似乎是在创建RsvgHandle期间由librsvg调用的(我认为)。
所以我不确定它是否真的是一个libxml2问题,librsvg使用libxml2的方式有问题,还是我尝试使用librsvg的问题?
任何libxml2或librsvg专家?
答案 0 :(得分:2)
尽管事实上,malloc()和free()或任何内存处理实现在C< C< C中都不一定是线程安全的。 11,总是存在共享/全局内存的问题。只要它们是只读的,不同线程中同一文件的文件句柄就不会那么糟糕。
但是,从libxml2 2.4.7开始,您可以在API级别启用线程安全性,对于每个文档的单个线程:http://www.xmlsoft.org/threads.html
当我查看libxml2 2.9.1的来源时,我确信线程安全已完全实现,尽管有全局互斥,但它还有一个原子分配函数。
此致 拉比
答案 1 :(得分:0)
100%确保xmlCleanupParser()永远不会在您的代码或任何代码中调用 其他库使用libxml2,它通过假设来破坏全局状态 在整个程序中没有剩余使用解析器。
http://xmlsoft.org/html/libxml-parser.html#xmlCleanupParser
丹尼尔