From: SASADA Koichi Date: 2012-06-26T05:15:49+09:00 Subject: [ruby-dev:45844] Re: 非同期割り込みに対する対処案(日本語版) (2012/06/26 5:07), Tanaka Akira wrote: > > 名前ですが、Thread.interruptable_at(:blocking) とかはどうかなぁ。  これだと,例外クラスを指定する場合, Thread.interruptable_at(:blocking, TimeoutError) みたいに書くの? >> begin >> > # 何か処理 >> > ensure >> > Thread.mask_interrupt(Exception, :uninterruptible) do >> > # 一度全部割り込み禁止にして >> > Thread.mask_interrupt(SignalException, :blocking_interruptible) do >> > # シグナルだけ割り込みを許して >> > # リソース解放処理 >> > end >> > end >> > end > 外側が :immediate_interruptible であるとすると、これは race がありますよね。 > > 「何か処理」で例外が起きて、ensure 節に入った後、 > Thread.mask_interrupt(Exception, :uninterruptible) を呼び出す前に > 非同期イベントによる例外が起きると、リソース開放処理がスキップされます。 > > 実装上はそこでは例外は起きないのかもしれませんが...  確かに,仰るとおりです.寝ぼけた頭では,とりあえず (1) 「実装上はそこでは例外は起きない」ことを仕様にする (2) ensure に細工する(あまりやりたくない) (3) 利用者が immediate にしない が考えられると思います.どれがいいでしょう.または,他の選択肢はあるで しょうか. -- // SASADA Koichi at atdot dot net