From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?=) Date: 2007-03-15T18:53:46+09:00 Subject: [ruby-dev:30590] [BUG?] Mutex or ConditionVariable for ruby 1.8[Re: Re: help: lib/shell for ruby 1.9] けいじゅ@いしつかです. In [ruby-dev:30588] the message: "[ruby-dev:30588] Re: help: lib/shell for ruby 1.9", on Mar/15 15:45(JST) Yukihiro Matsumoto writes: >まつもと ゆきひろです >|>なお、chdirに関してはDir.chdirをブロック付きで呼ぶという技が >|>使えると思います。 >|これって, thread safe です? ちがいますよね? > >他スレッドがchdirしようとすると例外になりますから、とりあえ >ずスレッドセーフです。ただ、現時点ではmutexとか使ってないん >で微妙なタイミングで問題が発生する可能性はありますね。 たしかにスレッドセーフだけど... これだと, shell.rb には使えないかも... どうも, Ruby1.8 の Mutex か ConditionVariable にバグがあるような気がし ます. 添付のスクリプトを実行すると, かなりの頻度でデッドロックになります. あと, Ruby1.9の方は大丈夫なのですが, 待ちスレッドの優先順位が気になら ないでもないです. ConditionVariable#wait で待っているスレッドの優先度 が最低になっています. -- cut here -- require "thread" #Thread.abort_on_exception=true m = Mutex.new c = ConditionVariable.new jobs = [] th1 = Thread.start { Thread.pass puts "th#1 syncronize enter" m.synchronize do puts "th#1 syncronize in" sleep 1 jobs.delete th1 c.signal puts "th#1 syncronize exit" end } th2 = Thread.start { Thread.pass puts "th#2 syncronize enter" m.synchronize do puts "th#2 syncronize in" sleep 2 jobs.delete th2 c.signal puts "th#2 syncronize exit" end } jobs.push th1 jobs.push th2 m.synchronize do while !jobs.empty? p jobs c.wait(m) p jobs sleep 0.5 end end __ ---------------------------------------------------->> 石塚 圭樹 <<--- ---------------------------------->> e-mail: keiju@ishitsuka.com <<---