けいじゅ@SHLジャパンです. 

In [ruby-list :02103 ] the message: "[ruby-list:2103] Re: Thread,
Exception and Timeout ", on Feb/12 11:39(JST) matz / caelum.co.jp
(Yukihiro Matsumoto) writes:

>あえて問題といえば,threadに外側から例外を発生させる方法がな
>い(プロセスに対するkill(2)のようなもの)ことですが,これはな
>くても何とかなりそうな気もします.

スレッド間の非同期通信に使えますので, あっても良いんじゃないかしらと思
うのですが??

ここで考えているのは, あるスレッドを指定して例外を発生させる機能です. 

>こんな感じでどうですか? threadを2つも使っちゃいますけど.
>
>def timeout(sec, msg = "timeout")
>  x = Thread.start { yield }
>  y = Thread.start {
>    sleep sec
>    Thread.kill x if x.status
>  }
>  Thread.join x
>  if y.status
>    Thread.kill y
>  else
>    raise TimeoutError, msg
>  end
>end

厳密にいえば, 別スレッドの中で起動しているので,

def foo
  begin
    timeout(2) do
      print "A"
      sleep 1
      return
      print "B"
    end
  rescue
    print "C"
  ensure
    print "D"
  end
  print "E"
end

foo

みたいな処理は, イテレータを実行しているのと処理が変わってきますよね.

このばあい:
  ADE
本当は:
  AD
となって欲しい.

スレッドに対して例外を非同期に送れれば, 以下のようにtimeoutも実現でき
ますし, 純正イテレータとして実行していますので上記のような問題も発生し
ません.

スレッドに対して例外を送るメソッドをThread#raise()としましょう.

def timeout(sec, msg = "timeout")
  begin
    x = Thread.current
    yield
    y = Thread.start {
      sleep sec
      x.raise TimeoutError, msg if x.status
    }
  ensure
    if y.status
      Thread.kill y
    end
  end
end

いかがでしょう??

__
..........................................石塚 圭樹@SHLジャパン(株)...
------------->アドレス変わりました!! e-mail: keiju / shljapan.co.jp <----