From: shugo@... (Shugo Maeda) Date: 1998-02-26T19:02:27+09:00 Subject: [ruby-list:6791] Re: Mutex/ConditionVariable/Queue 前田です。 In message "[ruby-list:6786] Re: Mutex/ConditionVariable/Queue" senda@ic.rdc.ricoh.co.jp wrote: |shugo> # 問題なのはwaitの実装ではなくてsignalした後どのスレッドに制御を |shugo> # 渡すかなのですよね? |shugo> | |そのとうりです。 | |# メールを出したあともしかしたら |# 誤解されるかもしれないと思っていました。 一瞬勘違いしそうになりました(^^; |shugo> | Signal-Return : signalしたプロセスを直ちにreturnさせる。 |shugo> 単純。 |shugo> |shugo> すみませんreturnとはどういう意味なんでしょう? |shugo> | |これはmonitor固有の実装になってしまうのですが、signal()とmutexのリリースを |同時にやって呼び出し元がモニタから抜けることを意味します。 | |意味はそういう意味なのですが実際の処理はwait()の最後のlockをやめてsignal側 |ではunlockをやめます。これで無用なコンテキストスイッチが減ります。 これはちょっと無理そうですね。 |shugo> | Signal-Urgent : signalを受け取ったスレッドを走らせる。発 |shugo> 行元に |shugo> | 次に走るプライオリティを与える。公平。 |shugo> |shugo> これはRubyのスレッドでは無理のような気がします。 | |Thread.runだけでは確実ではないのはたしかです。 |が、mutexに関係するthreadだけにかぎれば実装することは可能だと思うんですが。 Rubyスクリプトだけでできます? 他のスレッドをいったん全部止めてwaitから出る時にレジュームさせる、くらい しか思い付きませんでした。 優先度を指定したり、実行するスレッドを指定したりはできませんから直接 スレッドに制御を渡すのは無理ですよね。 |shugo> Rubyだとタイマーでスケジューリングイベントが起こるので、Thread.critical |shugo> をtrueにしないといずれスレッドが切り替わってしまいますよね。 |shugo> 切り替わったスレッドがwaitしていたスレッドでなければまた条件を偽にされ |shugo> る可能性があるわけですから同じことではないでしょうか。 |shugo> | |そのとおりです。本にもそう書いてあるのですが、本の結論は | 3つとも同様に強力であることは[Howard,1976]で論理的に示されており、 | 1つの種類を使用して別のものをシミュレートすることができる。 | 実際にどの種類のモニタを選択するかは好みの問題である。 |だそうです。 | |# 私も納得していないんですが。 うーん、納得いきませんね(^^; # [Howard,1976]というのを参照すれば納得できるのかな。 何とかスケジューリングの問題を避けて通れないかと思って考えて みたのですが、 1. Mutexの獲得要求のキューを二つ用意して、waitからの要求を優先させる。 # __cond_lock/__cond_unlockとかを作ってConditionVariableからしか呼ば # ないようにする。 2. waitの引数でMutexを指定するのを止めて、ConditionVariableのインスタンス 変数にMutexを持つようにする。 3. Mutex#ownerで現在Mutexのオーナーになっているスレッドを獲得できるように する。 4. signal/broadcast/waitはMutexのオーナースレッド以外が実行した場合は例外を 上げる。 こうすればsignalを呼んだ時点ではMutexが解放されていないので、他の スレッドに制御が移っても条件が偽になるような変更をされないですみます。 と思ったのですが、signalしたスレッドから条件を偽にしようとする スレッドに移った後、waitしたスレッドに移らずにまたsignalしたス レッドに戻ってMutexが解放され、その後さらにwaitしたスレッドに 移らず、条件を偽にしようとするスレッドに移る、というケースがもし あるとまずいですね。 # Rubyのスケジューラでこういうことが起きないことが保証されていれば # 大丈夫なのですが。 普通signalした直後に条件が偽になったりするケースはあまりないような 気もするので、実用的にはこれくらいは問題ないかな...とか思ったりする のですが、どうでしょう。 In message "[ruby-list:6781] Re: Mutex/ConditionVariable/Queue" Yukihiro Matsumoto wrote: |eval.cをいじってくれても全然構いませんよ ^^;;; というのはやはり辛いので(^^; -- 前田 修吾