[#2023] Class Method の index — (Dezawa Shin-ichiro) <dezawa@...>

出沢です

13 messages 1997/02/02

[#2158] [Req] pack/unpack — keiju@... (Keiju ISHITSUKA)

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

14 messages 1997/02/18
[#2166] Re: [Req] pack/unpack — matz@... (Yukihiro Matsumoto) 1997/02/18

まつもと ゆきひろです.

[#2277] ruby 1.0-970228 available — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです.

16 messages 1997/02/28

[ruby-list:2103] Re: Thread, Exception and Timeout

From: matz@... (Yukihiro Matsumoto)
Date: 1997-02-12 02:39:15 UTC
List: ruby-list #2103
まつもと ゆきひろです.

In message "[ruby-list:2102] Thread, Exception and Timeout"
    on 97/02/12, sinara@blade.nagaokaut.ac.jp <sinara@blade.nagaokaut.ac.jp> writes:
|
|原です。

|ところが、実際は他スレッドの例外は捕捉できないのです。

これは仕様です.thread内部で発生した例外はどんどん遡っていっ
て,Thread.startでストップします.その外側には伝わりません.
理由は,thread内部の例外を伝えるべき相手を特定できない(親に
伝えれば良いというものでもないので)ことです.

そういう意味では,設計上

|timer = Timeout.new(10)
|10秒で行なえなければ例外を発生させる処理
|timer.off

よりも

|timeout(10) {
|  10秒で行なえなければ例外を発生させる処理
|}

の方が望ましいと思います.処理がどのthreadに所属するか明確な
ので.というか,これこそがイテレータの意味なわけで,是非こう
いう風に使って欲しいです.

あえて問題といえば,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
                                まつもと ゆきひろ /:|)

In This Thread