From: SASADA Koichi Date: 2011-09-26T23:52:19+09:00 Subject: [ruby-dev:44552] Re: [Ruby 1.9 - Bug #5368][Open] ensure節でsleepするようなThreadがあるとインタプリタが終了しない (2011/09/26 7:03), m_takao wrote: > これは「ensure節の実行中に止めるのはNG」ということですよね? > いまの実装 (rev.33339) では、ensure節の実行中であっても、terminateされたら > (外側にさらなるensure節がなければ) ふつうに終了するので、辻褄が合わない気がします。  ご指摘の通り,「最初の1回だけは必ず ensure 中でも強制的に止めてしま う」という仕様になっていますね.現状では,ensure 中(後処理中)ではない ことを期待しています.ファイナライザ実行中でも,強制的にキャンセルされる ので,何か後処理をしている最中に止められるのは不可避です. # 今まで文句が無かったというのは,確率的にこういうケースが起きづらい, # ということでしょうかね.  真面目にやるなら,すでに何度か提案がある,こういう割り込みを制御するた めの仕組みを統一的に整備するってことになると思います.うーん,せめてファ イナライザの処理は main thread のみで行うようにしたほうがいいんだろうか.  もしくは,こういう処理を行うことがあるのなら,ちゃんと join してから死 にましょう,と開き直って,最初のご提案の通り,確実に殺す,というふうに振 るのかなぁ.それはそれで不便そうに思うのだけど.  結論も出てませんが,現状はなんとなくうまく動くことが多い,改善するには しんどそう,ということで,なんとなく現状の仕様になっている,ということか と思います.  もしうまい手があれば教えてください. -- // SASADA Koichi at atdot dot net