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

上記のコードを実行すると、

 #<Thread:0x00000000b1a198 sleep>
 #<Thread:0x00000000b1a120 sleep>
 [#<Thread:0x00000000b1a198 sleep>, #<Thread:0x00000000b1a198 sleep>, #<Thread:0x00000000b1a120 sleep>]
 /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 <internal:prelude>: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 <main>'
        from sized_queue.rb:19:in `times'
        from sized_queue.rb:19:in `<main>'

となります。
場当たり的なものですが[Bug #5195][ruby-dev:44400]の時と同様なpatchを添付します。適用後もtest/thread/test_queue.rbをパスします。
 
=end


-- 
http://bugs.ruby-lang.org/