原です。

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 されないみたいです。