[前][次][番号順一覧][スレッド一覧][生データ]

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      ]