From: Tomoyuki Chikanaga Date: 2010-08-16T09:46:18+09:00 Subject: [ruby-dev:42040] [Bug #3674] dRuby サーバプロセスを停止する時に時間がかかることがある チケット #3674 が更新されました。 (by Tomoyuki Chikanaga) [ruby-dev:42035] の咳さんの返信にフォローします。 > えっと、Rubyのスレッドかなにか問題の報告と考えてよいのでしょうか? > > ここにThread.passが必要な理由がわかりません。 > 私がなにかしたほうがよいのでしょうか? なにを指摘しているのかあいまいな報告ですみませんでした。 Thread#kill のソース(rb_thread_kill)をみると、特に明示的なスレッドの切り替えを 発生させるようなところがなかったため、 DRbServer#kill_sub_thread の以下の while ループはタイマーで強制的に切り替えが発生するまで ぐるぐる回り続けるのではないかと考えました。 list = @grp.list while list.size > 0 list.each do |th| th.kill if th.alive? end list = @grp.list end 先刻 irb でちょっと実験してみましたが kill で停止した Thread は 実際に終了するまで(?) ThreadGroup に残っているようです。 >> tg = ThreadGroup.new => # >> thr = Thread.new{ tg.add Thread.current; sleep } => # >> thr.kill; p tg.list [#] => [#] >> tg.list => [] ということで Thread#kill で停止させた Thread が本当に停止して ThreadGroup から消えるには 明示的なスレッド切り替えが必要なのではないか(充分とは限りませんが)と考えた結果が先のパッチです。 しかし Thread#kill または ThreadGroup の挙動が意図したものでないという可能性もあります。 これはよくわかりません。どうなのでしょうか? 個人的には Thread#kill するたびに切り替えするのは重そうなので現状のほうがいいような気がします。 ---------------------------------------- http://redmine.ruby-lang.org/issues/show/3674 ---------------------------------------- http://redmine.ruby-lang.org