(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