From: Tanaka Akira Date: 2005-11-21T14:27:26+09:00 Subject: [ruby-dev:27780] Re: Thread deadlock when signale handler raise exception In article <87irura6tj.wl@hail.nemui.org>, Tatsuki Sugiura writes: > 以下の状況 > > * スレッドが2つ以上あって > * trap に exit するか、例外を起こすブロック(proc)を渡しておく > > で、シグナルハンドラが呼ばれるとデッドロックしてしまいます。 ちょっと調べてみたのですが、sleep 中に trap から 例外/exit で出たときには main スレッドが THREAD_STOP なままで動いてい るようですね。 % ./ruby -ve ' trap(:INT) { puts "INT" exit } begin t = Thread.start { sleep } sleep ensure p Thread.current p Thread.current t.kill end ' ruby 1.9.0 (2005-11-20) [i686-linux] INT # # % というようにすると Thread.current が sleep 状態であることが 観察されますが、なにか出力すると THREAD_RUNNABLE になるよう で、2回目には run 状態になっています。それが ensure の先頭で 出力するとちゃんと終わる理由のようです。 どこか適切なところで THREAD_RUNNABLE に変えればいいように思 いますが... さて、どこで? -- [田中 哲][たなか あきら][Tanaka Akira]