From: KOSAKI Motohiro Date: 2012-06-26T04:44:12+09:00 Subject: [ruby-dev:45835] Re: 非同期割り込みに対する対処案(日本語版) > の3つになるような気がしていますので,ある例外がこれら 3 つのどの状態に > するか,という API を考えてみました. > > (a) Thread.interrupt_mask(exception, state) do; end > (b) Thread.interrupt_mask(hash) do; end (b)のほうは指定した全ての変更がアトミックに切り替わらないと絶対文句が出るAPIだと思うのですが、はたしてそんなことが可能でしょうか また、blocking_interruptibleのときが、pthread cancel モデルなのであれば、 自発的に例外を確認する pthread cancel() 関数相当のメソッドが必要だと思います > :immediate_interruptible > :blocking_interruptible > :uninterruptible メソッド名と引数の両方に interruptの単語が入っているのはやや冗長ではないでしょうか > (1) シグナルを許すと言っても,SIGUSR1 とかも許していいのかな. シグナル毎に違うExceptionを投げるべきだと思います。全部SignalExceptionの サブクラスにすれば既存のコードで動くんじゃないでしょうか >(2) POSIX みたいに,このメソッドは blocking とか,すべてきちんと > 書き連ねる必要があるのかな.かなり,無理な気がする > (そもそも,何がどのメソッドを呼び出すかわからない気が). 当面GVL離すところで、チェックするようにして、GVL離すタイミングを 徐々に増やしていくとかですかね。 >(3) ライブラリの至る所でこんなの書かれたらハッシュが大量発生して, > オーバヘッドで大変になったりしないだろうか.... > そもそも,これって多用するんだろうか. わたしの想定は、1行目で blocking_interruptible にして二度と変えない。 ensureの中でIOを呼ぶときだけ一時的に uninterruptibleに変更 > (4) ブロックを持たない Thread.mask_interrupt() は許すべきだろうか. > (意味としては,「この呼び出し以降はこの設定で」,という感じ) > なんとなく,許さない方がいいような気がするんだけど (3)とあわせてブロック必須だと全プログラムが一段ネストが深くなるので うれしくないなあ > (5) Thread.mask_interrupt() はネストしたら設定を混ぜていく,としたけど > 単に,置き換える,という選択肢もあるのか.こっちのほうが使いやすい? 混ぜていく。というのがなにを指しているのか取れなかったので置き換えるモデルで動作例を書いていただけるとうれしいです