また、黒田です。

 >まつもと ゆきひろです
 >
 >|黒田です。
 >
 >|について。system(とっても重いelispプログラム) を呼ぶ thread 
 >|が処理を奪ったままなので, 試しに(懲りずに)fork を狭んでみると
 >|うまく行きました。そんなもんなんでしょうか。
 >
 >systemがwaitでブロックしちゃうせいですね.ほとんどバグの領域
 >だと思います.次のリリースで修正しようと思います.

ruby - version 1.0-970528 (i686-linux) & Linux 2.0.30 で
write でブロックしているようです。以下のプログラムで(a0.gz は
800KB程度)

- --
def main_a
  for i in 1..20
    sleep(1)
    print i, "\n"
  end
end

def main_b
  sleep(3)
  print "start\n" 
  fi = open("/usr/home/jkuro/tmp/a0.gz", "r")
  a0 = fi.read
  fi.close
  print "end0\n" 
  fi = open("/usr/home/jkuro/tmp/a1.gz", "w")
  fi.write(a0)
  fi.close
  print "end1\n"
end

if TRUE
#if FALSE
  a = Thread.new{
    main_a
  }
  main_b
  while a.alive?
  end
else
  a = Thread.new{
    main_a
  }
  b = Thread.new{
    main_b
  }
  while a.alive?||b.alive?
  end
end
- --

の結果が l.21 のifを使う場合

-TRUE --
1
2
start
3
end0
end1
4
(略)
20
- --

となり、end0 と end1 の間に main_a の処理が行なわれてません。
特に困るわけではないですが、l.22 のifを使う場合は

-FALSE --
1
2
start
3
(略)
12
end0
end1
13
(略)
20
- --

となります。(こっちのほうが嬉しいかな)
- --
黒田  淳 (くろだ じゅん)