From: Yusuke Endoh Date: 2010-04-09T00:47:49+09:00 Subject: [ruby-dev:40936] [Bug #1952](Open) cannot stop with Ctrl+C チケット #1952 が更新されました。 (by Yusuke Endoh) ステータス ClosedからOpenに変更 担当者 Yukihiro Matsumotoにセット 優先度 NormalからHighに変更 遠藤です。 このチケットのために r24591 で * thread.c (rb_thread_terminate_all): do not ignore interrupt when reaping threads on termination. [ruby-dev:39107] という変更が入りましたが、rb_thread_terminate_all の後は main thread 以外は死んでいるという仮定があるので、非常に 都合が悪いです。 具体的には、以下のコードで、まだ生きているスレッドがいる のに vm が destruct されて、SEGV します (たまに) 。 begin 100.times do |i| begin Thread.start(Thread.current) {|u| u.raise } raise rescue ensure end end rescue p 100 end 「終了時には全スレッドに例外を投げ、死ぬまで待つ」という 仕様だと考えると、その例外を潰してしまうようなスレッドが いれば、終了時に固まるのは当然ではないでしょうか。 begin; sleep; rescue Exception; retry; end が Ctrl+C で止められないのと同じだと思います。 ということで、当該コミットを revert し、このチケットは rejected とすることを提案します。 -- Yusuke ENDOH ---------------------------------------- http://redmine.ruby-lang.org/issues/show/1952 ---------------------------------------- http://redmine.ruby-lang.org