2013-03-05 81 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

問候, 拉比