From: Tanaka Akira Date: 2008-01-06T19:22:19+09:00 Subject: [ruby-dev:32935] queue and timeout timeout で Queue#pop に時間制限をつけた時、タイムアウト時に Timeout::Error でなく ThreadError が発生します。 % ./ruby -v -rtimeout -rthread -e ' q = Queue.new timeout(1) { q.pop } ' ruby 1.9.0 (2008-01-06 revision 0) [i686-linux] prelude.rb:10:in `unlock': Attempt to unlock a mutex which is locked by another thread (ThreadError) from prelude.rb:10:in `ensure in synchronize' from prelude.rb:10:in `synchronize' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/thread.rb:181:in `pop' from -e:3:in `block in
' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/timeout.rb:46:in `timeout' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/timeout.rb:65:in `timeout' from -e:3:in `
' zsh: exit 1 ./ruby -v -rtimeout -rthread -e ' q = Queue.new timeout(1) { q.pop } ' 1.8 では Timeout::Error でした。 % ruby-1.8 -v -rtimeout -rthread -e ' q = Queue.new timeout(1) { q.pop } ' ruby 1.8.6 (2007-12-14 patchlevel 5000) [i686-linux] /home/akr/ruby/18/lib/ruby/1.8/timeout.rb:54: execution expired (Timeout::Error) from /home/akr/ruby/18/lib/ruby/1.8/timeout.rb:56:in `timeout' from /home/akr/ruby/18/lib/ruby/1.8/timeout.rb:76:in `timeout' from -e:3 おそらくこれのせいで、resolv がうまく動きません。 % ./ruby -v -rresolv -e ' ts = (1..10).map { Thread.new { p Resolv.getaddress("www.rubyist.net") } } ts.each {|t| t.join } ' ruby 1.9.0 (2008-01-06 revision 0) [i686-linux] "221.186.184.67" "221.186.184.67" "221.186.184.67" prelude.rb:10:in `unlock': Attempt to unlock a mutex which is locked by another thread (ThreadError) from prelude.rb:10:in `ensure in synchronize' from prelude.rb:10:in `synchronize' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/thread.rb:181:in `pop' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:495:in `block (2 levels) in each_resource' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/timeout.rb:46:in `timeout' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/timeout.rb:65:in `timeout' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:495:in `block in each_resource' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:891:in `block (3 levels) in resolv' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:889:in `each' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:889:in `block (2 levels) in resolv' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:888:in `each' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:888:in `block in resolv' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:886:in `each' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:886:in `resolv' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:485:in `each_resource' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:390:in `each_address' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:110:in `block in each_address' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:109:in `each' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:109:in `each_address' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:87:in `getaddress' from /home/akr/ruby/yarvo0/lib/ruby/1.9.0/resolv.rb:38:in `getaddress' from -e:2:in `block (2 levels) in
' -- [田中 哲][たなか あきら][Tanaka Akira]