From: shugo@... (Shugo Maeda) Date: 1998-02-26T15:28:46+09:00 Subject: [ruby-list:6780] Re: Mutex/ConditionVariable/Queue 前田です。 In message "[ruby-list:6774] Re: Mutex/ConditionVariable/Queue" senda@ic.rdc.ricoh.co.jp wrote: |読み直してみるとスレッドの実装の問題ではなく条件変数の処理に関わるものでし |た。この章であまり良くない実装例として上がっているものと前田さんの実装が一 |致しています。:-( :-( | def wait(mutex) | mutex.unlock # <------------------ (a) | @waiters_mutex.synchronize { | @waiters.push(Thread.current) | } | Thread.stop | mutex.lock # <------------------ (b) | end | |上のmutexを解除した時点(a)で別のスレッドが動きだしそれが条件を偽にする可能 |性があります。つまり、signal()によって起されたスレッドに制御を移したいのに |そうならない場合が起きてくるわけです。 signalの後で他のスレッドが条件を偽にしたら...ということですね。 # 問題なのはwaitの実装ではなくてsignalした後どのスレッドに制御を # 渡すかなのですよね? | Signal-Return : signalしたプロセスを直ちにreturnさせる。単純。 すみませんreturnとはどういう意味なんでしょう? | Signal-Urgent : signalを受け取ったスレッドを走らせる。発行元に | 次に走るプライオリティを与える。公平。 これはRubyのスレッドでは無理のような気がします。 # runしたスレッドに処理が切り替わるのであれば、現在の動作は # これになると思うんですが...。 | Signal-Continue : シグナルを発行したThreadをそのまま走らせる。 Rubyだとタイマーでスケジューリングイベントが起こるので、Thread.critical をtrueにしないといずれスレッドが切り替わってしまいますよね。 切り替わったスレッドがwaitしていたスレッドでなければまた条件を偽にされ る可能性があるわけですから同じことではないでしょうか。 -- 前田 修吾