From: "rklemme (Robert Klemme)" Date: 2012-04-11T23:37:25+09:00 Subject: [ruby-dev:45507] [ruby-trunk - Bug #5258] SizedQueueにBug #5195と同様のバグ Issue #5258 has been updated by rklemme (Robert Klemme). nobu (Nobuyoshi Nakada) wrote: > It seems natural because the only thread is about to sleep. I would expect the thread to block indefinitely. Signalling an error here seems to try to be too smart. Even in absence of other threads I can imagine conditions under which data is read from the queue (for example a signal handler). But even if an error is signaled here, it is certainly not a deadlock - for that you need at least two threads. This is rather something like "only blocking thread is suspended (with no chance to wake up)". Maybe that error should be controllable via a switch, e.g. Thread.single_thread_block_is_error = true # default false ---------------------------------------- Bug #5258: SizedQueueにBug #5195と同様のバグ https://bugs.ruby-lang.org/issues/5258#change-25833 Author: Glass_saga (Masaki Matsushita) Status: Assigned Priority: Normal Assignee: kosaki (Motohiro KOSAKI) Category: lib Target version: 2.0.0 ruby -v: ruby 1.9.4dev (2011-09-01 trunk 33157) [x86_64-linux] =begin [Bug #5195][ruby-dev:44400]と同様ですが、SizedQueue#pushでsleepしているthreadをwakeupさせると、SizedQueueの@queue_waitにそのthreadがpushされてしまいます。 require 'thread' sq = SizedQueue.new(1) sq.push(0) t1 = Thread.start { sq.push(1) ; sleep } nil until t1.stop? t1.wakeup nil until t1.stop? t2 = Thread.start { sq.push(2) } nil until t1.stop? && t2.stop? p t1, t2 sq.instance_eval{ p @queue_wait } 3.times{ sq.pop } t2.join 上記のコードを実行すると、 # # [#, #, #] /usr/local/lib/ruby/1.9.1/thread.rb:185:in `sleep': deadlock detected (fatal) from /usr/local/lib/ruby/1.9.1/thread.rb:185:in `block in pop' from :10:in `synchronize' from /usr/local/lib/ruby/1.9.1/thread.rb:180:in `pop' from /usr/local/lib/ruby/1.9.1/thread.rb:324:in `pop' from sized_queue.rb:19:in `block in
' from sized_queue.rb:19:in `times' from sized_queue.rb:19:in `
' となります。 場当たり的なものですが[Bug #5195][ruby-dev:44400]の時と同様なpatchを添付します。適用後もtest/thread/test_queue.rbをパスします。 =end -- http://bugs.ruby-lang.org/