2012-03-16 6 views
2

私は、ICU regexクラスを使用するかなり大きなプロジェクトを持っています。基本的にはシングルスレッドモードとマルチスレッドモードで動作します。後者の場合、すべてのスレッドは内部データ(使用する正規表現を含む)を初期化します。マルチスレッドの使用シナリオにおけるICUの正規表現のメモリ破損

元々、プロジェクトはshared_ptrを使ってRegexPatternクラスを作成し、その後の使用のために正規表現を保存しました。 新しいRegexMatcherクラスを割り当てるために余分なメモリ割り当てが必要となるため、RegexPattern :: matcher()呼び出しでボトルネックと判断されたので、shared_ptrをRegexMatcherに格納し、一致を呼び出す前にreset(str)を呼び出します。

私は再度強調したい - regexesはスレッド間で共有されていません。

シングルスレッドモードですべてうまくいっていて、期待どおりにアプリが少し速く動作しました。 しかし、一度に〜10の処理スレッドを実行しようとすると、ICUライブラリが奇妙な結果を出すようになりました。デバッグビルドでは、データの一部が部分的に初期化され、無効な値がいくつかここに表示されました。

私はICUコードを見ましたが、そのような動作を引き起こす静的なものは見当たりません。

だから、質問は(ほとんどが、彼らは適切なドキュメントの欠如によって引き起こさ)です: 1)ではなくRegexPattern(使用されてRegexMatcherは、メンバーがパターンを指している)のRegexMatcher格納するのに有効なシナリオですか? 2)ドキュメントに記載されていないICU正規表現のマルチスレッディング使用に制限はありますか?ただ、注意すべき

:私のdevのプラットフォームは、Win32

注用にコンパイルは、Visual C++ 2010である:私は理由です、同時に10のスレッドで唯一の正規表現のマッチングを行い孤立テストアプリケーションでは、このような奇妙な動作を再現することができませんでした質問はむしろ開放的です。

+0

小さなテストケースを含めることができれば、おそらくバグを報告する価値があるでしょう。 –

+0

小さなテストケースの作成には問題があります。おそらく、問題をデバッグするだけでもう少し時間を費やし、結果を投稿します。 –

答えて

2

実際、私は間違っていました。単一のregexpが別のスレッドから使​​用されているケースがあります。明らかに、RegexPatternの代わりにRegexMatcherを使用すると問題が発生する

+0

うれしいことに、あなたのためにうまくいったのです! –

関連する問題