2010-07-19 5 views
4

Je suis en train d'écrire un petit code timeout:Pourquoi ce code imprime-t-il deux fois la même chose?

t = Thread.new { sleep 3 } # <- The thread that will do stuff. 
Thread.new { sleep 2; t.kill; p 'hi!' } # <- The thread that will kill it after two seconds. 
t.join 

Si le premier thread termine son travail dans les deux secondes, il arrêtera, et le fil conducteur aura rien à faire. Cela provoquera la sortie du programme avant que le deuxième thread ne soit associé à la partie t.kill. Mais, quand je cours ce code, "hi!" est imprimé deux fois. Le remplacement du p par puts résout le problème. Pourquoi cela arrive-t-il?

+0

Impossible de reproduire. –

+0

@Marc: J'ai trouvé que si vous tapez 'ruby' dans un terminal (sans arguments) et que vous collez simplement le code et appuyez sur Ctrl-D,' "hi" 'ne sera imprimé qu'une seule fois. Mais si vous mettez le code dans un fichier et que vous faites quelque chose comme "ruby test.rb", cela arrivera. Je pense que cela peut avoir quelque chose à voir avec la vitesse à laquelle ruby ​​peut lire un fichier par rapport à la vitesse à laquelle ruby ​​peut lire stdin. – Adrian

+1

Certainement un bug. 'ruby somefile.rb' l'imprime deux fois la plupart du temps, c'est intermittent. Pourrait-il le déposer sur redmine.ruby-lang.org? Vous pouvez spécifier "ruby 1.9.3dev (2010-07-19 trunk 28679) [x86_64-darwin10.4.0]" pour 'ruby -v', comme je l'ai reproduit avec tronc. Ou laissez-moi savoir et je vais créer le problème. –

Répondre

1

Ruby avait un bug avec io tampon et threading qui ressemble exactement à ceci. Il a été corrigé récemment, donc mise à niveau.

0

Cela me semble "salut!" est mis en mémoire tampon et vidé deux fois, une fois par le thread anonyme qui a fait l'opération p, et une fois par le thread principal. S'il s'agissait d'un programme C, la façon de le réparer serait de désactiver la mise en mémoire tampon sur stdout, ou bien d'utiliser write pour fd 1, sans passer par stdio. Probablement Ruby a un équivalent au moins de la première de ces options?

Questions connexes