From: Kazuhiro NISHIYAMA Date: 2000-10-15T05:14:27+09:00 Subject: [ruby-dev:11228] $SAFE=4 で Thread.new On Sun, 15 Oct 2000 04:24:58 +0900 Masatoshi SEKI wrote: > Thread.new できないセキュリティレベル([ruby-dev:9437])も > ほしいですが、できる $SAFE = 4 も欲しい気がしません? ということは$SAFE = 5になる? 一番安全なのがほしいだけなのでそれでも全然かまいませんが。 > > それから$SAFE = 4ではThread.newできないようにしてほしいです。 > > できると > def foo > while true > Thread.new do foo end > end > end > などとされる危険がありますが、こういう危惧ですか ? そうではなくてThread::abort_on_exception=trueの時に rescueできずに落ちてしまうというのが問題なのです。 rescue Exceptionでraise SystemExitとかの普通は rescueできない例外も捕まえられたのにこれには 困りました。 % cat e4.rb s = '' Thread.start do $SAFE = 4 begin Thread.new do raise end rescue Exception s = $!.to_s end end.join sleep 1 puts s puts 'ok' % ruby e4.rb ok % ruby -d e4.rb Exception `RuntimeError' at e4.rb:6 - e4.rb:6: unhandled exception from e4.rb:5:in `initialize' from e4.rb:5:in `new' from e4.rb:5 from e4.rb:2:in `start' from e4.rb:2 % > これに対処するために優先度やThreadGroupができたそうです。([ruby-dev:9438]) > > 優先度下げて、適当な時間でThreadGroup#listのスレッドを停めるように > すれば([ruby-list:25260])、巨大な(あるいは多数の)オブジェクトを作られて > しまうのと同じくらいの危険さで済むような気がします。(充分危険か!?) Thread.newがなければrescueできるということのよりも 巨大な(あるいは多数の)オブジェクトの問題の方が危険 そう。これも何か制限できるとうれしそう。 --- ZnZ(ゼット エヌ ゼット) 西山和広(Kazuhiro NISHIYAMA) mailto:zn@mbf.nifty.com