MonitorMixin

RubyのMonitorMixinを使った版のProducer-Consumerです。Mutexを直接使ったものよりも見通しはよい…でしょうか。

require 'monitor'

class BlockingQueue
  def initialize
    @queue = []
    @queue.extend MonitorMixin
    @cv = @queue.new_cond
  end

  def enqueue(e)
    @queue.synchronize do
      @queue << e
      @cv.signal
    end
  end

  def dequeue
    @queue.synchronize do
      while @queue.length == 0
        @cv.wait
      end
      @queue.shift
    end
  end
end

q = BlockingQueue.new

t = Thread.new do
  k = 1
  loop do
    # puts k
    q.enqueue(k)
    k += 1
  end
end

u = Thread.new do
  loop do
    puts q.dequeue
  end
end

t.join
u.join