next up previous contents index
Search Next: Datenaustausch per Pipeline Up: Koordination von Threads Previous: ConditionVariable   Contents   Index


Monitore

Eine alternative Methode bietet die Bibliothek Monitor[*].

require 'monitor'

buf = []
buf.extend(MonitorMixin)
empty_cond = buf.new_cond

# Konsument
Thread.start do
  loop do
    buf.synchronize do
      empty_cond.wait_while { buf.empty? }
      print buf.shift
    end
  end
end

# Produzent
while line = ARGF.gets
  buf.synchronize do
    buf.push(line)
    empty_cond.signal
  end
end

Der Produzent schiebt eine Zeile Text in das buf-Array und übergibt durch den Aufruf von signal die Kontrolle an den Konsumenten, der den Text aus dem Array ausliest. Wenn der Konsument seinen synchronize-Block verlässt, erzeugt der Produzent den nächsten Eintrag.



Footnotes

... Monitor[*]
lib/monitor.rb


(C) 2002 by dpunkt.de, Armin Roehrl, Stefan Schmiedl, Clemens Wyss 2002-01-20