杉浦です。 >>> In Message "[ruby-dev:27752] Re: Thread deadlock when signale handler raise exception" >>> <20051118202630.084A5720.ocean / m2.ccsnet.ne.jp>, >>> H.Yamamoto <ocean / m2.ccsnet.ne.jp> said; > >いまいち絞れないのですが、デッドロックする状況を見つけました。 > >単に私のやり方が悪いのかもと思ったのですが、入出力を伴うと現象が変わる > >と言う不思議な状況なので、多分バグだろうと言うことでレポートします。 > >整理できていないので長いですがご勘弁下さい。 > >ruby 1.8.4 (2005-10-29) [i486-linux] で確認しています。 > ruby 1.9.0 でも再現しますか?また、enable-pthread でビルドしましたか? > no / yes の場合は、多分「マルチスレッドだとシグナルが ruby インタプリタ > スレッドに届くとは限らない」問題ではないかと思います。[ruby-dev:25713] うーむ。(多少現象は違いますが)pthread が無効でも起こりました。 前述の 1.8.4 は Debian package (sid) のもので enable-pthread は 有効になっています。 新たに CVS かも取ってきた ruby 1.9.0 (2005-11-19) を enable-pthread 無しとあり両方でコンパイルして試してみました。 enable-pthread が有効な 1.9 では同じ現象が起きます。 enable-pthread 無しのバージョンだと、 sugi@tempest:~% /usr/local/ruby1.9-np/bin/ruby -rtimeout -rthread \ > -e 'trap(:INT){exit}; timeout(3){ Queue.new.pop }' を実行して、 Ctrl+c を1回押すと、タイムアウトもせずデッドロックして しまいます。 ターミナルから起動しているものなら単に Ctrl+c を何回か押せばいいので それほどに問題はないのですが、tDiary を FastCGI で動かす時にちょっと 困っています。 FastCGI アプリケーションがプロセスマネージャから TERM を受け取った場合、 現在処理中のサイクルを完了して終了しないといけないのですが、時々これが resolv.rb 中のコードの queue timeout で待っている時に飛んできます。 するとここでデッドロックしまい、マネージャから刺さっているとみなされて 強制的に KILL され、最終的にユーザにエラーが帰ります。 -- Tatsuki Sugiura mailto:sugi / nemui.org