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