2013-03-05 92 views
0

我正在寻求支持将SVG图像渲染为位图,我正在使用librsvg。到目前为止,它运作良好,并使用开罗,万岁!不过,我遇到了一个问题:由于libxml2导致librsvg崩溃?

我们有一个类似于Windows资源管理器的控件,例如,它会在目录中创建缩略图大小的文件图像,因此该产品将被扩展以生成SVG缩略图。

它使用后台线程来生成缩略图图像,以便在UI工作时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专家?

回答

2

尽管,确定malloc()和free()或者其他的内存处理实现用C < 11不一定是线程安全的,总是有共享/全局内存的问题。只要它们是只读的,对不同线程中的同一文件的文件句柄并不是那么糟糕。

但是,从libxml2的2.4.7,你也许可以在API级别,使线程安全的,每文档根单丝:http://www.xmlsoft.org/threads.html

当我看的libxml2 2.9.1的来源,我尽管全球互斥,尽管线程安全已得到充分实施,但还是有原子分配功能。

下载:ftp://xmlsoft.org/libxml2

问候, 拉比