模块 MonitorMixin

在并发编程中,监视器是一个对象或模块,旨在被多个线程安全地使用。监视器的定义特征是其方法以互斥的方式执行。也就是说,在每个时间点,最多只能有一个线程执行其任何方法。与推理更新数据结构的并行代码相比,这种互斥性大大简化了对监视器实现的推理。

您可以在 Wikipedia 页面上阅读有关 监视器 的更多通用原则。

示例

简单的 object.extend

require 'monitor.rb'

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

buf.empty? 时,消费者线程等待生产者线程将一行数据推送到 buf 中。生产者线程(主线程)从 ARGF 读取一行数据并将其推入 buf,然后调用 empty_cond.signal 以通知消费者线程有新数据。

简单的 include

require 'monitor'

class SynchronizedArray < Array

  include MonitorMixin

  def initialize(*args)
    super(*args)
  end

  alias :old_shift :shift
  alias :old_unshift :unshift

  def shift(n=1)
    self.synchronize do
      self.old_shift(n)
    end
  end

  def unshift(item)
    self.synchronize do
      self.old_unshift(item)
    end
  end

  # other methods ...
end

SynchronizedArray 实现了一个 Array,可以同步访问项目。这个 被实现为 Array 的子类,其中包含了 MonitorMixin 模块。