代码之家  ›  专栏  ›  技术社区  ›  Adrian

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

  •  4
  • Adrian  · 技术社区  · 14 年前

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

    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 回复  |  直到 14 年前
        1
  •  1
  •   taw    14 年前

    Ruby有一个关于IO缓冲和线程的bug,看起来与此完全相同。它最近被修复了,所以升级。

        2
  •  0
  •   zwol    14 年前

    这对我来说就像“嗨!”正在缓冲和刷新两次,一次是由执行 p 操作,并由主线程执行一次。如果这是一个C程序,修复它的方法是禁用缓冲 stdout ,否则使用 write 到fd 1,绕过stdio。大概Ruby至少有一个等价的选项?