Annotation of embedaddon/php/ext/mbstring/oniguruma/doc/FAQ.ja, revision 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>