From: sinara@... Date: 1997-01-14T20:10:35+09:00 Subject: [ruby-list:1696] Re: [Q] Use of Thread and Mutex 原です。 次の様な、どう考えても無限ループになりそうなスクリプトが、 実は適当な時間で fail します。 -----^ test_thread_hash.rb #!/usr/local/bin/ruby @bar = {} $s = "a" def foo(n) loop do s0 = $s if (@bar[s0] = TRUE) && !@bar[s0] fail "#{n})" + s0 end $s = $s.succ end end Thread.start { foo(0) } Thread.start { foo(1) } sleep -----$ test_thread_hash.rb これで3日ハマってしまった。^^; やっぱり Hash は保護した方が いいみたいですね。 thread.rb を初めて見てみたんですが、Thread.exclusive という隠 しメソ?と run と stop だけを使ってうまいこと作ってあるんです ねえ。感心してしまった。 で、気づいたんですが、push, pop の保護はここではほとんどされて ません。 それから、ちょっとルーズな所があって、例えば class Queue の def pop non_block=FALSE if @que.length == 0 raise ThreadError, "queue empty" if non_block @waiting.push Thread.current Thread.stop end @que.shift end で、@que.length と @que.shift の間のタイムラグがやばい気がし ます。 もうひとつ。Queue では、pop が実は shift で実装されているとい うのが、、。 Queue を継承して shift, unshift, delete,.. など というメソッドを増やして QueArray みたいなクラスを作ろうとす ると、ややこしくなります。Queue#in, out みたいな名前の方が良 かったかも。 もちろん Queue のイメージからいうとこの pop はもっともではあ るし、QueArray は独立に作るのがスジかもしれないですが。 ---===-=-=-=-=-=-=-=-=======--=-=-=-==-=-===-=-=-=-=-=-=--=-==-=-- Shin-ichro Hara(Nagaoka Univ.of Tech.)