2009-04-18 9 views
0

を監視Iはhttp://www.ruby-doc.org/stdlib/libdoc/monitor/rdoc/index.htmlの例に続き、コードを少し修飾:私はプログラム実行をさせRubyはセグメンテーション違反

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

あなたのコードは(プロデューサー・ループにwhile文コメントアウトして)現状では生産者スレッドは単に一回ループして終了を介して実行されます。消費者はbufから1つの生成された行を読み取り、それから決して到着しないより多くの行を待つデッドロック状態に置かれます。

Rubyのスレッドスケジューラにはデッドロック検出機能が組み込まれているため、 'consumer'-loopがデッドロックしていると見なしてプログラムを終了させます。

デッドロックを確認するには、プロデューサをグローバル変数$producerに変更し、ループステートメントを$consumer = Thread.start do ... endで囲みます。 =>#<スレッド:0x000000010afb58死んだ(とスリープスレッドの$消費者)

プロデューサのwhileループに関するコメントを取り出して、現在の時刻を2秒間隔で生成する作業(無限)ループです。

関連する問題