2010-07-19 2 views
4

Я пытаюсь написать некоторый небольшой код тайм-аут:Почему этот код дважды печатает одно и то же?

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 

Если первая нить завершает его работу в течение двух секунд, он остановится, и основной поток не будет иметь ничего общего. Это заставит программу выйти до того, как второй поток попадет на часть t.kill. Но, когда я запускаю этот код, "hi!" печатается дважды. Замена p на puts исправляет его. Почему это происходит?

+0

Невозможно воспроизвести. –

+0

@Marc: Я обнаружил, что если вы введете 'ruby' в терминал (без аргументов) и просто вставьте код и нажмите Control-D,' 'hi" 'будет только печататься один раз. Но если вы действительно поместите код в файл и сделаете что-то вроде 'ruby test.rb', это произойдет. Я думаю, что это может иметь какое-то отношение к скорости, с которой рубин может читать файл, и скорость, с которой рубин может читать stdin. – Adrian

+1

Определенно ошибка. 'ruby somefile.rb' будет печатать его дважды большую часть времени, это прерывисто. Может ли файл на redmine.ruby-lang.org? Вы можете указать «ruby 1.9.3dev (2010-07-19 trunk 28679) [x86_64-darwin10.4.0]» для 'ruby -v', поскольку я воспроизвел это с помощью соединительной линии. Или дайте мне знать, и я создам проблему. –

ответ

1

У Ruby была ошибка с io-буферизацией и нарезкой, которая выглядит именно так. Это было исправлено в последнее время, поэтому обновление.

0

Это звучит для меня как «привет!». буферизуется и краснеет дважды, один раз анонимной нитью, которая выполняла операцию p, и один раз по основному потоку. Если бы это была программа на C, способ исправить это было бы отключить буферизацию на stdout, или использовать write в fd 1, минуя stdio. Предположительно, Ruby имеет эквивалент, по крайней мере, первого из этих вариантов?

Смежные вопросы