yarv-dev:675
From: Shiro Kawai <shiro lava.net>
Date: Tue, 11 Oct 2005 02:04:15 -1000 (HST)
Subject: [yarv-dev:675] Re: 'nil while true' isn't terminated by SIGINT
From: SASADA Koichi <ko1 atdot.net> Subject: [yarv-dev:673] Re: 'nil while true' isn't terminated by SIGINT Date: Tue, 11 Oct 2005 20:29:47 +0900 > ところで,Multi-VM になったとき,SIGINT が着たらどうなるべきなんだろ > う.全部の VM に取り合えず投げるべきなんだろうか. > > 複数スレッド走っていたら,どのスレッドでシグナルハンドラは動くべきなん > だろう.これは,main スレッドに限定してしまえばいいのかな. Gaucheでは次のような方針にしています。 1. デフォルトでは、Schemeから作成したスレッドは全てのシグナルを ブロック。したがって非同期シグナルはメインスレッドに届く。 2. 特定のスレッドで特定のシグナルを受けたい、あるいはシグナル受信 専用のスレッドを作りたい場合は、アプリケーションプログラマが 明示的にスレッド毎のシグナルマスクを設定。届いたシグナルをマスク してないスレッドが複数ある場合はそのどれか一つに届く(POSIXモデル)。 1.はPOSIXのモデル (スレッドはそれを作成したスレッドのマスクを継承) とは異なるんですが、Gaucheの場合システムレベルでシグナルが届いた後 VMループに戻らないとSchemeシグナルハンドラが呼ばれないため、 condition variableなんかで待ってるスレッドにシグナルが配送されて しまうと配送から処理までの遅延がいくらでも大きくなり得ます。 reliableにシグナルを処理するにはまめにシグナルマスクを設定する しかなく、プログラマの負担を考えるとデフォルトでmain以外は 全部ブロック、というモデルにしないとやってられない、と判断しました。 リファレンスマニュアルのCore Library > System interface > Signal > Signals and threads にもうちょっと詳しく説明してあります。 --shiro -- ML: yarv-dev quickml.atdot.net 使い方: http://www.atdot.net/~ko1/quickml
672 2005-10-11 20:17 [sheepman sheepman.sa] 'nil while true' isn't terminated by SIGINT 673 2005-10-11 20:29 ┗[ko1 atdot.net ] 674 2005-10-11 18:59 ┣[shudo computer.org ] -> 675 2005-10-11 21:04 ┗[shiro lava.net ]