MutexとConditionVariable
RubyのMutexとConditionVariableを使ってProducer-Consumerを作ってみました。ブロックするキューBlockingQueueクラスです。
Mutexクラスはリエントラントではないのでちょっと注意が必要でした。
require 'thread' class BlockingQueue def initialize @queue = [] @cv = ConditionVariable.new @mutex = Mutex.new end def enqueue(e) @mutex.synchronize do @queue << e @cv.signal # self ←疑問:ここで、selfを返したほうがよいと思いますか?>識者のみなさま end end def dequeue @mutex.synchronize do while @queue.length == 0 @cv.wait(@mutex) 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
疑問: そういえば、refeで表示されるドキュメントのtypoを見つけました。これはどこにお知らせすればよろしいのでしょうね…。
refe Mutex#synchronize s/ロックを開放/ロックを解放/