2010-07-19 97 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!"被打印出两次。用puts替换p可以修复它。为什么会发生?

+0

无法重现。 – 2010-07-19 02:53:51

+0

@Marc:我发现如果你在终端输入'ruby'(不带参数),只需粘贴代码并按下Control-D,'“嗨”'只会打印一次。但是,如果你真的把代码放到一个文件中并执行'ruby test.rb'这样的事情,它就会发生。我认为这可能与ruby可以读取文件的速度和ruby可以读取stdin的速度有关。 – Adrian 2010-07-19 03:02:41

+1

绝对是一个错误。 'ruby somefile.rb'会在大部分时间打印两次,这是间歇性的。可以在redmine.ruby-lang.org上存档吗?你可以为'ruby -v'指定“ruby 1.9.3dev(2010-07-19 trunk 28679)[x86_64-darwin10.4.0]”,正如我用trunk重现的一样。或者让我知道,我会创建这个问题。 – 2010-07-19 03:25:26

回答

1

Ruby有一个IO缓冲和线程的错误,看起来就像这样。它最近已经修复,所以升级。

0

这听起来像我喜欢“嗨!”被缓冲起来并刷新两次,一次是通过执行p操作的匿名线程,一次通过主线程。如果这是一个C程序,修复它的方法是禁用stdout上的缓冲,否则使用write跳过fd 1,绕过stdio。据推测,Ruby至少有这些选项中的第一个相当于?