Adds monitor functionality to an arbitrary object by mixing the module with
include
. For example:
require 'monitor' buf = [] buf.extend(MonitorMixin) empty_cond = buf.new_cond # consumer Thread.start do loop do buf.synchronize do empty_cond.wait_while { buf.empty? } print buf.shift end end end # producer while line = ARGF.gets buf.synchronize do buf.push(line) empty_cond.signal end end
The consumer thread waits for the producer thread to push a line to buf while buf.empty?, and the producer thread (main thread) reads a line from ARGF and push it to buf, then call empty_cond.signal.
Enters exclusive section.
# File monitor.rb, line 162 def mon_enter if @mon_owner != Thread.current @mon_mutex.lock @mon_owner = Thread.current end @mon_count += 1 end
Leaves exclusive section.
# File monitor.rb, line 173 def mon_exit mon_check_owner @mon_count -=1 if @mon_count == 0 @mon_owner = nil @mon_mutex.unlock end end
Enters exclusive section and executes the block. Leaves the exclusive
section automatically when the block exits. See example under
MonitorMixin
.
# File monitor.rb, line 187 def mon_synchronize mon_enter begin yield ensure mon_exit end end
Attempts to enter exclusive section. Returns false
if lock
fails.
# File monitor.rb, line 146 def mon_try_enter if @mon_owner != Thread.current unless @mon_mutex.try_lock return false end @mon_owner = Thread.current end @mon_count += 1 return true end