原です。

> まつもと ゆきひろです.

> |(3)あるスレッドが TCPsocket.open でブロックしているときに、
> |他のスレッドが全て止まる様にみえるのですが、これは仕様ですか?
> |(それとも私の勘違いかも。)これを回避する方法はありますか?
> 
> あー,socketのthread対応が不完全であることは十分考えられます
> が,TCPsocket.openってブロックしましたっけ? ブロックするのは
> acceptだけだと思っていたのですけど.
> 
> もしかしてconnect(2)がtimeoutするまでのことを言っているのか
> な? だとするとこれは(仕様ではないにしても)対応は難しいですね
> え.ITIMER_REALを使えば可能ですけど,今度は他の部分の効率が
> 下がりすぎるし….

そうみたいです。タイムアウトを見ている時に起こっている様です。

perl の connect は connect(2) をそのまま使っているみたいで、
タイムアウトは fcntl で NONBLOCK にしてから、select で調べて
作っていました。質問です。

(1)ruby の Socket#conncect も同じでタイムアウトは見てない
ですよね? fcntl はどうやったら使えますか?うまく使えたとして
やはり Thread との相性は悪いですか?

(2)TCPsocket.open は、タイムアウトを見ているようですが、こ
れは内部での connect の部分でしょうか?タイムアウトは何秒にな
っていますか?その秒数を制御できませんか?

(3)socket stream からの read もタイムアウトを見たいのですが、
もちろん select を使えば、実現できると思いますが、これは Thread
との相性はどうなるでしょうか?いい方法はありますか?
---===-=-=-=-=-=-=-=-=======--=-=-=-==-=-===-=-=-=-=-=-=--=-==-=--
                            Shin-ichro Hara(Nagaoka Univ.of Tech.)