2009-04-18 11 views
0

J'ai suivi l'exemple de http://www.ruby-doc.org/stdlib/libdoc/monitor/rdoc/index.html et modifié un peu le code:Ruby moniteur erreur de segmentation

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 

Je laisse l'exécution du programme. Environ 5 minutes plus tard, il lance une "erreur de segmentation". Quelque chose lié à une impasse?

/Jack

Répondre

1

Comme votre code signifie (avec en commentaire While en boucle de producteur) le fil de producteur se contente à travers la boucle une fois sorties. Le consommateur lit la ligne produite par buf et se retrouve dans une impasse en attendant d'autres lignes qui n'arriveront jamais.

Le programmateur Thread de Ruby intègre une détection de blocage, de sorte qu'il termine le programme lorsqu'il voit que la boucle 'consommateur' est bloquée.

Pour voir l'impasse pour vous-même, tournez le producteur dans une variable globale $producer et enveloppez l'instruction de boucle avec $consumer = Thread.start do ... end. Le chargement du code dans irb et l'évaluation de $ producer devraient aboutir à => # < Thread: 0x000000010afb58 dead> (et $ consumer dans un thread dormant)

Sortez les commentaires relatifs à la boucle while du producteur et vous aurez un boucle de travail (infinie) qui produit l'heure actuelle à intervalles de 2 secondes.

Questions connexes