0

我希望支持将 SVG 图像渲染为位图,我正在使用 librsvg。到目前为止,它运行良好,并且使用 Cairo 进行绘制,万岁!但是我遇到了一个问题:

我们有一个类似于 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 专家吗?

4

2 回答 2

2

尽管事实上 malloc() 和 free() 或任何内存处理实现在 C < 11 中不一定是线程安全的,但始终存在共享/全局内存的问题。只要它们是只读的,不同线程中同一文件的文件句柄就不会那么糟糕。

但是,从 libxml2 2.4.7 开始,您可能能够在 API 级别为每个文档的单个线程启用线程安全: http ://www.xmlsoft.org/threads.html

当我查看 libxml2 2.9.1 的源代码时,我确信线程安全已完全实现,尽管存在全局互斥锁,但还有一个原子分配功能。

下载: //xmlsoft.org/libxml2

问候,拉比

于 2014-05-17T14:33:04.590 回答
0

确保 100% 确保 xmlCleanupParser() 永远不会在您的代码或使用 libxml2 的任何其他库中调用,它通过假设整个程序中没有剩余的解析器使用来破坏全局状态。

http://xmlsoft.org/html/libxml-parser.html#xmlCleanupParser

丹尼尔

于 2013-03-06T06:14:13.237 回答