Ruby监控分段故障

时间:2009-04-18 03:00:12

标签: ruby monitor

我按照http://www.ruby-doc.org/stdlib/libdoc/monitor/rdoc/index.html中的示例进行了修改并稍微修改了代码:

require 'monitor.rb'

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

producer = Thread.start do
# producer
line = "produce at #{Time.now}"
#while line
  buf.synchronize do
    puts "==> #{line}"
    buf.push(line)
    empty_cond.signal
  end
  sleep(2)
  #line = "produce at #{Time.now}"
#end
end

loop do
   buf.synchronize do
      empty_cond.wait_while { buf.empty? }
      item = buf.shift
      puts "got #{item.inspect}"
   end
end

我让程序运行。大约5分钟后,它引发了“分段故障”。与僵局有关的东西?

/插座

1 个答案:

答案 0 :(得分:1)

当你的代码代表(在producer-loop中注释掉while语句)时,生成器线程只运行一次循环并退出。消费者从buf中读取一条生成的行,然后处于死锁状态,等待更多永不到达的行。

Ruby的Thread调度程序具有内置的死锁检测功能,因此当它看到'consumer'循环已经死锁时会终止该程序。

要查看自己的死锁,请将生成器转换为全局变量$producer,并使用$consumer = Thread.start do ... end包装loop-statement。将代码加载到irb并评估$ producer应该导致=> #<线程:0x000000010afb58死> (和睡眠线程中的$消费者)

取出与生产者的while循环相关的注释,你将有一个工作(无限)循环,以2秒的间隔产生当前时间。