原です。

> まつもと ゆきひろです.

> 理由は,thread内部の例外を伝えるべき相手を特定できない(親に
> 伝えれば良いというものでもないので)ことです.

そうですよね。ときどき fork とごっちゃになってしまって。^^;


> こんな感じでどうですか? threadを2つも使っちゃいますけど.

とにかく処理の中途で終了可能でなくてはいけないんで、どうしても
thread 2 つか、ループを回さないといけないですね。

こんなのもありかな。

def timeout(sec, msg = "timeout")
  r = nil
  a = Time.now
  x = Thread.start { r = yield }
  while Time.now < a + sec
    return r unless x.status
    Thread.pass
  end
  if x.status
    Thread.kill x
    raise TimeoutError, msg
  end
  r
end


石塚さんのいうように、Thread#raise があってもうれしいですけど。