遠藤です。

2012-03-11 SASADA Koichi <ko1 / atdot.net>:
> 提案:
>  非同期割り込みをチェックするタイミングを制御するための仕組みを新設す
> る.原案は [1] にあるとおり.ただ,名前については今後検討する.
>
>  制御の種類は次の通り,
>   0. なるべく頻繁にチェックする(これまで通りの動作)
>   1. ブロック I/O のタイミングだけチェックする


一応補足しますと、ブロック I/O に限らずブロックを発生させうる API
は全部チェックすべきだと思います。例えば:

  - 明示的なウェイト (Kernel#sleep)
  - 条件変数待ち (ConditionVariable#wait)
  - スレッド終了待ち (Thread#join)
  - プロセス終了待ち (Kernel#system, Process#wait など)

要するに rb_thread_blocking_region を呼ぶあたり全部。少なくとも
POSIX thread の cancellation point はそう定義されています。


もっと細かいことを言うと、POSIX thread では mutex のロック待ちは
ブロックしうるけれど cancellation point になっていません。
その理由は、推測ですが

  - mutex のロックで割りこまれるようではプログラムを書くのが難しい
  - cancellation point に関係なく、mutex はロック内の処理を一瞬で
    終了することが求められていて、ロックで「ブロック」するほど待つ
    ケースは想定されていない

などかと思います。
ただし Haskell の非同期例外 [2] では mutex のロックも cancellation
point (相当) になっており、デファクトの設計ポリシーがあるわけでは
なさそうです。



> 参考文献:
> [1] Akira Tanaka "Re: Thread#raise, Thread#kill, and timeout.rb are
> unsafe" ruty-talk (2008.3)
> http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/294917

[2] Simon Marlow, Simon Peyton Jones, Andy Moran and John Reppy.
Asynchronous Exceptions in Haskell, in PLDI'01.

-- 
Yusuke Endoh <mame / tsg.ne.jp>