スレッドの abnormal exit をどう通知するか

Mosh では Erlang のようにリンクしたプロセス(実体はスレッド)が abnormal exit した場合に、ただちに親も exit するようにしたいと思っている。
これの利点は被リンクプロセスが、相手の abnormal exit に対してのアクションポリシーを明示していない場合に、exit してしまうことにより、ポリシーを決定するようにユーザーに促すことができる点だと思う。


ただし実行速度を落とさずに上のような仕組みを作る方法を思いつかないので、既存の Scheme 実装がどのような仕組みを提供しているか調べてみる。

Gauche

Gauche では thread-join! 時にスレッドの abnormal exit を例外として上げる。(SRFI-18 準拠の動作)

(use gauche.threads)

(let1 th (make-thread (lambda () (car 3)))
  (thread-start! th)
  (guard [c (#t (format #t "[[~a]]" c))]
         (thread-join! th)))


thread-join! しなければ、そのスレッドがエラーで落ちても知りようがない。thread-join! しないのだから、そのスレッドには関心が無いのだという意思表示である。

Ruby 1.9

Gauche と同様の動作。

あるスレッドで例外が発生し、そのスレッド内で rescue で捕捉されなかっ た場合、通常はそのスレッドだけがなにも警告なしに終了されます。ただ しその例外で終了するスレッドを Thread#join で待っている他の スレッドがある場合、その待っているスレッドに対して、同じ例外が再度 発生します。

仮結論

join 時に例外状況を知ることが出来るというのは合理的だと思った。(実装も楽だし)
ただし Mosh 的にはそういう用途はあまり想定していない。join しないと例外状況が分からないというのは困る場合もあるだろうし。
デフォルトで abnormal exit メッセージが被リンクプロセスに送られるという動作で良いと思えてきた。
メッセージを受け取って解釈するかどうかは、ポリシーに任せると。