From: sinara@... Date: 1997-01-16T19:58:54+09:00 Subject: [ruby-list:1724] Re: [Q] Use of Thread and Mutex 原です。 一連の thread がらみのレポートに対して、まつもとさんの反応が あまりないけど(^^; 、、、単なるぼやきだと思われたかな? 改めて現状報告です。 【1】[ruby-list 1669] で述べた ----^ deadlock_test2.rb #!/usr/local/bin/ruby require "thread" m = Mutex.new Thread.start { m.synchronize { m.synchronize { } } } sleep 1 ----$ deadlock_test2.rb が Segmentation fault で落ちる件ですが、最新バージョンでは落ちなく なりました。 修正がなされたのでしょうか? 【2】[ruby-list 1696] で述べた thread.rb の class Queue は、うま く動作しないことがあるのではないかという話ですが、確かに次のスク リプトは、結構早く止まってしまいます。 -----^ queue_test.rb #!/usr/local/bin/ruby require "thread" $que = Queue.new $s = "a" def foo(n) loop do unless $que.pop print "##{n} poped nil.\n" exit end end end Thread.start { foo(0) } Thread.start { foo(1) } Thread.start { loop do print $s,"\n" $que.push $s $s = $s.succ end } sleep -----$ queue_test.rb やはり、まずいみたいです。 【3】[ruby-list 1696] で言ったように、Hash#[]= は、thread に対し て保護されていないようです。 そこで Mutex を使って保護してみました。 -----^ mutex_test.rb #!/usr/local/bin/ruby require "thread" $mt = Mutex.new $bar = {} $s = "a" def foo(n) loop do s0 = $s $mt.synchronize { # Thread.exclusive { $bar[s0] = TRUE } if !$bar[s0] fail "#{n})" + s0 end $s = $s.succ end end Thread.start { foo(0) } Thread.start { foo(1) } sleep -----$ mutex_test.rb これを動かすと、20回に1回ほど10秒ぐらいで停止します。 Thread.exlusive を使うとこれは起こらないので、class Mutex の方 も若干甘い所があるのではないでしょうか? if, while 構文などは全て排他処理が必要では? ---===-=-=-=-=-=-=-=-=======--=-=-=-==-=-===-=-=-=-=-=-=--=-==-=-- Shin-ichro Hara(Nagaoka Univ.of Tech.)