为什么这段代码打印两次相同的东西?

时间:2010-07-19 00:15:10

标签: ruby multithreading timeout

我正在尝试编写一些小的超时代码:

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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

这听起来像“嗨!”正在进行缓冲和刷新两次,一次是由执行p操作的匿名线程执行,一次是由主线程执行。如果这是一个C程序,修复它的方法是禁用stdout上的缓冲,或者使用write到fd 1,绕过stdio。据推测,Ruby至少有这些选项中的第一个?