(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