module MonitorMixin

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

您可以在 监视器 (Monitors) 的维基百科页面上阅读有关一般原理的更多信息。

示例

简单对象.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 模块。