From: Yusuke ENDOH Date: 2010-04-15T22:48:29+09:00 Subject: [ruby-dev:40994] Re: [Bug #1952](Open) cannot stop with Ctrl+C 遠藤です。 2010年4月14日10:20 U.Nakamura : > In message "[ruby-dev:40936] [Bug #1952](Open) cannot stop with Ctrl+C" > on Apr.09,2010 00:47:49, wrote: >> 「終了時には全スレッドに例外を投げ、死ぬまで待つ」という >> 仕様だと考えると、その例外を潰してしまうようなスレッドが >> いれば、終了時に固まるのは当然ではないでしょうか。 >> >> begin; sleep; rescue Exception; retry; end >> >> が Ctrl+C で止められないのと同じだと思います。 > > 元の再現コードはCtrl+C(=Interrupt)を潰していません。 > なので、同じではないと思います。間違ってるかしら。 全く同じではないですが、「終了しろー」という例外を潰している 点が同じだと思います。 Interrupt によってメインスレッドがプロセスの終了処理を開始し、 生きているサブスレッドに eTerminateSignal (Ruby レベルからは 見えない仮想的な例外) を投げてサブスレッドを全消ししようとし ているのに、サブスレッド側がその例外潰している、というのが、 実際に起きていることです。 そう考えると、これは仕様かなーと思うのでした。 >> ということで、当該コミットを revert し、このチケットは >> rejected とすることを提案します。 > > SEGVは困ったもんなので、このこと自体に反対はしません。 どうしても直したいならば、 - サブスレッドの終了待ち状態で SIGINT を受け取ったら、 eTerminateSignal を再送する - しつこく Ctrl+C を押していればいつか終了できる、かも - eTerminateSignal を捕捉できない例外とする - サブスレッドの ensure が実行されない - eTerminateSignal を投げて数秒しても終わってくれない場合、 捕捉できない例外を投げる - サブスレッドの ensure が実行されない危険が緩和されるが 本質的に解決はしない。あとダサい くらいを思いつきましたが、どれも問題がある or 面倒ですね。 new feature な気もするので、やるとしても 1.9.3 以降という ことにして、今回は revert させてもらうことにします。 -- Yusuke ENDOH