2012-03-16 50 views
2

我有一個使用ICU正則表達式類的相當大的項目。基本上它可能以單線程模式和多線程模式運行。在後一種情況下,所有線程都初始化自己的內部數據(包括它們使用的正則表達式)。ICU正則表達式 - 多線程使用場景中的內存損壞

原來項目中使用的shared_ptr來RegexPattern級存儲進一步使用正則表達式。 我確定RegexPattern ::匹配()調用成爲瓶頸,因爲它涉及到額外的內存分配分配新RegexMatcher類,所以我決定打電話比賽前切換到店的shared_ptr到RegexMatcher,並調用復位(STR)。

我想再次強調 - 線程之間不共享正則表達式。

因此,一切都在單線程模式都很好,和應用工作作爲我的預期略快。 但是,當我試圖運行~10個處理線程時,ICU庫開始給出奇怪的結果 - 在調試版本中,部分數據的一部分被部分初始化,一些無效值在這裏和那裏加劇。

我看着ICU代碼,並沒有看到,可能導致這種行爲的任何靜態的東西。

所以,問題是(他們大多會因缺乏適當的文檔): 1)是否有有效的方案來RegexMatcher存儲,而不是RegexPattern(RegexMatcher已被使用的部件指向模式)? 2)文檔中未列出的ICU正則表達式的多線程使用是否有任何限制?

只是要注意的:我的開發平臺的Visual C++ 2010,編譯爲Win32

注:我沒能再現獨立的測試應用程序,只做正則表達式匹配的同時10個線程這種怪異的行爲,這就是爲什麼問題是相當開放的。

+0

也許值得提交錯誤的,特別是如果你可以包括一個小的測試案例 – 2012-03-19 16:29:08

+0

創作小試的情況下是有問題的。也許我會花更多的時間調試問題,然後發佈結果 – 2012-03-20 17:13:46

回答

2

其實我錯了 - 有單時,正則表達式是由不同的線程中的情況。顯然,問題的情況下使用RegexMatcher時,而不是RegexPattern

+0

很高興爲您解決問題! – 2012-04-04 23:38:17