April 03, 2009

鬼車とマルチスレッド

高速で日本語に対応した正規表現ライブラリとして著名な鬼車ですが、何も考えずにコンパイルするとマルチスレッドに対応してくれません。mregexpなんかと一緒に利用するときは注意が必要です。

一応、スレッドアンセーフな状態の鬼車がマルチスレッド環境で落ちた時のログを載せておきます。
*** glibc detected *** double free or corruption (fasttop): 0x....... ***
======= Backtrace: =========
/lib64/libc.so.6
/lib64/libc.so.6(cfree)
/usr/local/lib/libonig.so.2(onig_free_node_list)
鬼車に付属のドキュメント(doc/FAQ.ja)には以下のように記されています。
2. スレッドセーフ

スレッドセーフにするには、以下の(A)と(B)のどちらかを行なえば
よい。

(A) Oniguruma Layer

oniguruma/regint.hの中の以下のマクロを定義する。

USE_MULTI_THREAD_SYSTEM
THREAD_ATOMIC_START
THREAD_ATOMIC_END
THREAD_PASS

何らかの初期化/終了処理が必要であれば、以下のマクロに定義する。
THREAD_SYSTEM_INIT
THREAD_SYSTEM_END


(B) Application Layer

同時に複数のスレッドが、正規表現オブジェクトを作成する、
または解放する、ことを行なってはならない。
それらのオブジェクトが全く別のものであっても。

もう少し詳しい説明は、このドキュメントの中の
"スレッドセーフに関する補足"に書いておいた。

例えば、Linux(POSIX環境)ではどうするか、といったことはこのドキュメントの中には記述されていないので、多くの人は自分でマクロ定義を記述することになると思います。

C言語の知識が無い人や、できれば既存のものを利用したい人は、Oniguruma for Javaという拡張パッチを利用することができます。

Windows、およびGNU/LINUX向けのマルチスレッド対応用マクロが定義済みです。

Java向けの拡張機能は、フラグMORE_SUPERIOR_JAVA_SUPPORTを定義した場合にのみ有効になります。

matssaku at 21:34│Comments(0)TrackBack(0)clip!C 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔