Return to FAQ.ja CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / mbstring / oniguruma / doc |
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