From: SASADA Koichi Date: 2011-09-26T14:24:10+09:00 Subject: [ruby-dev:44547] Re: [ruby-dev:44546] [Ruby 1.9 - Bug #5368][Open] ensure節でsleepするようなThreadがあるとインタプリタが終了しない (2011/09/25 21:51), Masaki Matsushita wrote: > 次のコードを実行するとCPU使用率が跳ね上がった状態になりインタプリタが終了しません。 > > Thread.new do > begin > sleep > ensure > sleep > end > end > > 現在のrb_thread_terminate_allでは最初に1回だけ生きているスレッドに対してterminate_iを実行していますが、ensure節でsleepするようなThreadがあると、そのThreadは寝たままになってしまいwhile(!rb_thread_alone())が無限ループになってしまいます。  ここで,バグとは何でしょうか. (1) CPU 使用率がはねあがる (2) プロセスが死なない  (1) が問題というのは理解できます.あまり文句がないんで放置している部分 です.直そうと思えば,正しく他のスレッドを待ち合わせをすればできると思っ ています.  (2) については仕様です.ご提案の修正方法では,とにかく生きていたら殺 す,ということをしていますが,例えば他のスレッドで何か時間のかかる終了処 理をしていた場合(例えば,終了時にネットワークで外部に情報を送る,という ようなことをしている場合),それを強制的に止めてしまうため,まずいことに なります.  ということで,これに関しては,現状だと仕様かな,と思いますが,もっと良 い仕様があれば,ご提案頂けと助かります. -- // SASADA Koichi at atdot dot net