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>