けいじゅ@日本ラショナルソフトウェアです.

In [ruby-dev :2344 ] the message: "[ruby-dev:2344] Re: [Problem]
thread and signal and sleep ", on Apr/15 15:25(JST) Yukihiro Matsumoto
writes:

>まつもと ゆきひろです

>|1. gets中は今まで入力してたもの(継続行の情報を含む)をクリアし, プロン
>|   プトを再出力してそのまま戻る.
>|2. eval中はその時のバックトレースを出力して, 抜け出したいところまで
>|   throwしている. 
>|
>|1は, raiseだと駄目なのでflagチェックに変える必要が出てきますね. ただし,
>|プロンプトの再出力が問題でこれはflagチェックでは駄目でその場で処理を行
>|なう必要がありますよね. そうすると他のスレッドが別のスレッドが抱えてい
>|るオブジェクトを扱う必要が出てくるのでちょっと気分が悪いですよね.
>
>うーん,こっちはReadline.readlineをbegin..rescueで括ればでき
>ると思うんですが,なにか勘違いしている?

そうなんですよね. できるですが, libcのgetcの問題があるからgets中の割り
込み処理で例外(大域ジャンプ)が発生すると駄目なんです...

>|問題は, 2で現時点で他のスレッドから問題のスレッドのバックトレースを取
>|るのは不可能だと思いますが?
>
>現時点では出来ないような気がします.が,それに対する解決方法
>が石塚さんのおっしゃるものである必要があるのかどうかは検討の
>余地があると思います.

そうですね. 

>繰り返しますが,カレントスレッドが予想通りのものになることの
>保証は現在のスレッドの実装を大幅に書き換えない限り不可能です.
>
>そういう前提の元で「irbの要求を満たすから」という理由だけで
>は仕様変更にうなずけないのが現状です.私の現在の印象では石塚
>案を採用しても嬉しいのはirbだけで,それ以外の人に対しては救
>済にならない(複雑になるだけ)と思ってます.

カレントスレッドがシグナルを受けとれるというのは, それなりに分かりやす
いモデルだと思うんですよ. 

まず, 内因的なシグナルの場合は, こうでないと利用不可能です. ただ, 内因
的なシグナルって一般ユーザが利用できないものが多いのはたしかですが, ほ
とんどのシグナルが内因的なものであることも事実です.

外因的なシグナルの場合, その時カレントだったスレッドがシグナルを受ける
ことになって, 結局スレッドが不定になるというのはあるのですけどね.

それに, 実はカレントスレッドになってもirbとしては嬉しくないんですよね...
標準な動作はpriemptiveなスレッドになっているんですが, Thread.start{..}
はどこでも入力可能なので, そうなると受けとるスレッドが不定になってしま
うんですね.

>ThreadがProcのようにbindingとしても使えたり,Threadの現在の
>トレースバックが取れたりしたら良いのかも知れません.
># 実装は難しいけど.

うーん. これは魅力的ですね...

>|SIGPIPEって実際に読み出した時(or書き込んだ時)発生するんじゃなかった? 
>|それなら, シングルスレッドの時はどのsocketが問題かすぐ分かります.
>
>うーん,そうか.今調べたらOSレベルのスレッドだとトラップによっ
>て発生したシグナルはそのスレッドに届けられるみたいですね.が,
>rubyのスレッドでどうやってこれを実現するか….

でしょ. そうじゃないと困るもの.

# mprotectでSEGVを利用するマルチスレッド版objectstoreのクライアントが
# 動作しなくなる. 

>|シグナルと同じようなThread間の同期機能があれば別なんでしょうけど... こ
>|れは実現が結構難しいだろうなあ...
>
>これはちょっと….

だめですか? Threadのbindingでもよいですが... あと, Threadのコンテキス
トを入れ換えることができても良いかなと...

>|これだとシグナル毎にスレッドを分けることができて嬉しいと思うんだけど?
>|
>|  SIGALRM用のスレッド, SIGWINCH用のスレッド...
>
>シグナルハンドラにはシグナル番号が渡るのでスレッドをわける必
>要ないと思うんですけど.

確かに, dispatchを書く必要があるかどうかの違いですけどね.

ただ, main_threadにはシグナル処理以外の仕事をさせたいことだってありま
すし, そういった場合はmain_thread以外にシグナル処理をやらせることがで
きるのは, 嬉しいことだと思います. 特に, シグナルが来るとそのスレッドは
stopの状態から走りはじめちゃうので, 本当に停止させておきたい時など,
stopから目覚めた時にどっちの生で目覚めたか一々チェックしないといけなく
なりますよね.

このことは, シングルスレッドでも同じです. でも, マルチスレッドにすると
そういうことからも解放されたいってのがあるんだと思うんですよ. これは, 
シングルスレッドソケットサーバよりもマルチスレッドソケットサーバの方が
簡単に書けるというのと似たような話しじゃないかと思います.

__
................................石塚 圭樹@日本ラショナルソフトェア...
----------------------------------->> e-mail: keiju / rational.com <<---