原です。
In message "[ruby-list:13920] Re: Thread GC (Re: Re: timer)"
on 99/04/20, hisanori / sitc.toshiba.co.jp <hisanori / sitc.toshiba.co.jp> writes:
|
|松尾です.
|そうなんです。気になるんです。
|
|# 他の方は気にならなかったのかなぁ…。
似たようなことを [ruby-list:770] で質問しました。
その時は ObjectSpace でどう?なんて言われたりしたんだけど。
現在のスレッド一覧は
ObjectSpace.each_object(Thread) { |obj| p obj }
で得られます。大量のスレッドを扱いたい場合は、止めたい奴を
Thread.kill(obj) してから、
ObjectSpace.garbage_collect
する、という手があります。いずれにしても当然、止めたいのが
どれか特定するために、ユーザーが管理しないといけないんだけ
ど。
と思ったのだけど、強制的に殺されたスレッドは GC の対象にな
らないみたいだけど?
実験:
Thread.kill Thread.start { sleep 0.5 }
ObjectSpace.each_object(Thread) { |obj| p obj }
sleep 1
ObjectSpace.garbage_collect
ObjectSpace.each_object(Thread) { |obj| p obj }
これは、GC されてないみたい。次の様に1行目で Thread.kill
しないならうまく行くのだけど。
Thread.start { sleep 0.5 }
ObjectSpace.each_object(Thread) { |obj| p obj }
sleep 1
ObjectSpace.garbage_collect
ObjectSpace.each_object(Thread) { |obj| p obj }
さらになぜか、
class Foo; end
Thread.start { sleep 0.5 }
ObjectSpace.each_object(Thread) { |obj| p obj }
sleep 1
ObjectSpace.garbage_collect
ObjectSpace.each_object(Thread) { |obj| p obj }
でもスレッドが GC されないみたいです。