From: KOSAKI Motohiro Date: 2011-09-26T22:40:19+09:00 Subject: [ruby-dev:44550] Re: [Ruby 1.9 - Bug #5368][Open] ensure節でsleepするようなThreadがあるとインタプリタが終了しない 2011年9月26日14:24 SASADA Koichi : > (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) については仕様です.ご提案の修正方法では,とにかく生きていたら殺 > す,ということをしていますが,例えば他のスレッドで何か時間のかかる終了処 > 理をしていた場合(例えば,終了時にネットワークで外部に情報を送る,という > ようなことをしている場合),それを強制的に止めてしまうため,まずいことに > なります. > >  ということで,これに関しては,現状だと仕様かな,と思いますが,もっと良 > い仕様があれば,ご提案頂けと助かります. C言語だってat_exit()でsleep()したら死なないし、C++だってデストラクタでsleep()したら 死なないしねえ。 プログラミング言語はアホなコードにたいしてアホな振る舞いをするのはそういうものという気がします。個人的には。 ensureにsleepを書くことが避けることが不可能。という話になるとまたちょっと話が変わってくるかと 思いますが、そういう例は思いつきませんでした。