Queueのどうでも良い話

thread.rbでQueue#.popがこのように定義されている。

 def pop(non_block=false)
    @mutex.synchronize{
      while true
        if @que.empty?
          raise ThreadError, "queue empty" if non_block
          @waiting.push Thread.current
          @mutex.sleep
        else
          return @que.shift
        end
      end
    }
  end

そこで、次のようなコードを実行すると

require 'thread'

queue = Queue.new

t = Thread.start do
  loop{ queue.pop }
end

2.times do
  nil until t.stop?
  t.wakeup
end

nil until t.stop?

queue.instance_eval{ p @waiting }
p queue.num_waiting

以下のようになる。

[#<Thread:0x00000001899698 sleep>, #<Thread:0x00000001899698 sleep>, #<Thread:0x00000001899698 sleep>]
3

本当にどうでも良い。