Почему этот код печатает одну и ту же вещь дважды? - PullRequest
4 голосов
/ 19 июля 2010

Я пытаюсь написать небольшой код тайм-аута:

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 исправляет это.Почему это происходит?

Ответы [ 2 ]

1 голос
/ 29 июля 2010

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

0 голосов
/ 27 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...