2012年6月26日 3:40 SASADA Koichi <ko1 / atdot.net>:

>  (a) Thread.interrupt_mask(exception, state) do; end
>  (b) Thread.interrupt_mask(hash) do; end
>
> state は
>
>  :immediate_interruptible
>  :blocking_interruptible
>  :uninterruptible
>
> の 3 つのシンボルが指定できるとします.それぞれ,モード 0, 1, 2 にあたる
> と考えます.

名前ですが、Thread.interruptable_at(:blocking) とかはどうかなぁ。

>  このとき,デフォルトは互換性 100% の方針ということで,全ての例外が
> immediate_interruptible だとします.
>
>  begin
>    # 何か処理
>  ensure
>    # リソース解放処理
>  end
>
> という,よくありそうな処理があったとき,リソース解放処理はなるべくなら解
> 放されたくない,ただし,^C,もしくは SIGTERM などのシグナルは blocking
> 処理しそうになった,もしくはしている時は割り込まれるのを許す,という処理
> は次の様になるでしょうか.
>
>  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) を呼び出す前に
非同期イベントによる例外が起きると、リソース開放処理がスキップされます。

実装上はそこでは例外は起きないのかもしれませんが...
-- 
[田中 哲][たなか あきら][Tanaka Akira]