From: "kosaki (Motohiro KOSAKI)" <kosaki.motohiro@...>
Date: 2012-11-27T08:16:23+09:00
Subject: [ruby-dev:46638] [ruby-trunk - Bug #5368] ensure節でsleepするようなThreadがあるとインタプリタが終了しない


Issue #5368 has been updated by kosaki (Motohiro KOSAKI).


1.8と同等と書いたのは

Thread.new do
  begin
    sleep
  ensure
    sleep
  end
end

というプログラムが一度ensure節のsleepで寝てしまうが、Ctrl-Cにより終わることは出来る。という挙動を指しており、
このスクリプト以外の細かい挙動について、不整合はあると思います。


----------------------------------------
Bug #5368: ensure節でsleepするようなThreadがあるとインタプリタが終了しない
https://bugs.ruby-lang.org/issues/5368#change-33990

Author: Glass_saga (Masaki Matsushita)
Status: Assigned
Priority: Normal
Assignee: matz (Yukihiro Matsumoto)
Category: core
Target version: 2.0.0
ruby -v: -


=begin
次のコードを実行すると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())が無限ループになってしまいます。

while(!rb_thread_alone())の毎回のループでカレントスレッドがメインスレッドであった場合に、生きているスレッドに対してterminate_iを実行するようなpatchを書いたところ、このバグは再現しなくなりました。
patchを添付します。patchの適用後もtest-allをパスします。
=end


-- 
http://bugs.ruby-lang.org/