Annotation of embedaddon/php/ext/mbstring/oniguruma/doc/FAQ.ja, revision 1.1.1.1

1.1       misho       1: FAQ    2006/10/30
                      2: 
                      3: 1. 最長マッチ
                      4: 
                      5:    onig_new()の中で、ONIG_OPTION_FIND_LONGESTオプション
                      6:    を使用すれば最長マッチになる。
                      7: 
                      8: 
                      9: 2. スレッドセーフ
                     10: 
                     11:    スレッドセーフにするには、以下の(A)と(B)のどちらかを行なえば
                     12:    よい。
                     13: 
                     14:    (A) Oniguruma Layer
                     15: 
                     16:        oniguruma/regint.hの中のNOT_RUBYの部分の以下のマクロを定義する。
                     17: 
                     18:        USE_MULTI_THREAD_SYSTEM
                     19:        THREAD_ATOMIC_START
                     20:        THREAD_ATOMIC_END
                     21:        THREAD_PASS
                     22: 
                     23:        何らかの初期化/終了処理が必要であれば、以下のマクロに定義する。
                     24:        THREAD_SYSTEM_INIT
                     25:        THREAD_SYSTEM_END
                     26: 
                     27: 
                     28:    (B) Application Layer
                     29: 
                     30:        同時に複数のスレッドが、正規表現オブジェクトを作成する、
                     31:        または解放する、ことを行なってはならない。
                     32:        それらのオブジェクトが全く別のものであっても。
                     33: 
                     34:    もう少し詳しい説明は、このドキュメントの中の
                     35:    "スレッドセーフに関する補足"に書いておいた。
                     36: 
                     37: 
                     38: 3. メーリングリスト
                     39: 
                     40:    鬼車に関するメーリングリストは存在しない。
                     41: 
                     42: //END
                     43: 
                     44: 
                     45: 
                     46: スレッドセーフに関する補足
                     47: 
                     48: スレッドセーフにするには、個別のアプリケーションの中で行うか、
                     49: Onigurumaライブラリの中で行うか、どちらかを選ぶことができます。
                     50: (Onigurumaを使用する側で対処するか、Onigurumaに対処させるか
                     51: どちらか片方で行う必要があるということです。)
                     52: 
                     53: これらの方法について、以下(A)と(B)で説明します。
                     54: 
                     55: マルチスレッドAPIは、それぞれのプラットフォームによっても
                     56: 異なりますので、以下の説明の中で具体的に何を呼ぶのかを
                     57: 書くことは無理です。実際に使用されるマルチスレッドAPIで、
                     58: 対応する機能のものを指定してください。
                     59: 
                     60: (A) Onigurumaの中で対応する場合
                     61: 
                     62: oniguruma/regint.hの中のNOT_RUBYで囲まれている部分の中で
                     63: 以下のマクロを定義して再コンパイルしてください。
                     64: 
                     65: USE_MULTI_THREAD_SYSTEM
                     66: 
                     67:   単に有効にすればよいです。
                     68: 
                     69: THREAD_ATOMIC_START
                     70: THREAD_ATOMIC_END
                     71: 
                     72:   THREAD_ATOMIC_STARTからTHREAD_ATOMIC_ENDで囲まれた
                     73:   プログラムのコード部分をあるスレッドが実行中に、他の
                     74:   スレッドに実行権が移動しないことを保障するものに定義
                     75:   してください。
                     76:   (名前の通り、囲まれたコード部分をスレッドアトミックに
                     77:    するという意味)
                     78: 
                     79: THREAD_PASS
                     80: 
                     81:   これを実行したスレッドから、他のスレッドに実行権を委譲
                     82:   するものに定義をしてください。(再スケジュールを呼び出す
                     83:   という意味)
                     84:   対応する機能が全くなければ、空定義にしてください。
                     85: 
                     86: (参考例)
                     87: Rubyの場合を例にすると、
                     88: Rubyは自分自身で独自のスレッド機能を実装しています。
                     89: その機能を使用すると、以下のように定義すればよいことに
                     90: なります。
                     91: 
                     92: #define USE_MULTI_THREAD_SYSTEM
                     93: #define THREAD_SYSTEM_INIT
                     94: #define THREAD_SYSTEM_END
                     95: #define THREAD_ATOMIC_START       DEFER_INTS
                     96: #define THREAD_ATOMIC_END         ENABLE_INTS
                     97: #define THREAD_PASS               rb_thread_schedule()
                     98: 
                     99: Rubyの場合、タイマ割り込みを使用して、スレッドの切り替えを
                    100: 行っています。DEFER_INTSは割り込みハンドラの実行を一時的に
                    101: 止めるためのマクロです。ENABLE_INTSマクロで割り込みハンドラ
                    102: の実行を許可します。
                    103: これによって、THREAD_ATOMIC_STARTからTHREAD_ATOMIC_END
                    104: で囲まれた部分の実行中に、他のスレッドに実行権が移動しません。
                    105: 
                    106: 
                    107: (B) アプリケーションの中で対応する場合
                    108: 
                    109: 以下を保障するように、スレッドの実行を制御してください。
                    110: 
                    111: 同時に複数のスレッドが、正規表現オブジェクトを作成する、または解放する、ことを
                    112: 行なってはならない。それらのオブジェクトが全く別のものであっても。
                    113: 
                    114: onig_new(), onig_new_deluxe(), onig_free()のどれかの呼び出しを、
                    115: 複数のスレッドが同時に実行することを避けてください。同時でなければ別にかまいません。
                    116: 
                    117: これは何故必要なのかというと、正規表現オブジェクトを作成する
                    118: 過程で、内部で共通に参照するテーブルがあります。
                    119: このテーブルに対してのデータ登録処理が複数のスレッドで衝突して
                    120: 異常な状態にならないために必要です。
                    121: 
                    122: // END

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>