From: Yusuke ENDOH Date: 2008-07-03T00:16:52+09:00 Subject: [ruby-dev:35330] Re: deadlock detection for 1.9 遠藤です。 > |細かい話ですが、以下のようなコードで 1.8 と挙動が異なります。 > |1.8 だと deadlock 扱いではなく sleep forever になります。 > |[ruby-dev:31041] 関連の話題です。 > | > |Thread.new do > | sleep 1 > |end > |Thread.stop > | > |1.8 といっしょだとドキュメントを書くのが楽でいいなというだけなんですが。 > > 遠藤さんに聞いてみないと。 シングルスレッドで Thread.stop すると例外になるので、Thread.stop で 意図的に sleep forever しようという人はいないような気がします。 むしろ例外などで意図せず単一スレッドになってしまった場合を考えると、 上の例で deadlock 扱いしてくれないのはうれしくないと思います。 なので「単一スレッドでは deadlock 検出しない」という基準にはあまり 納得できないのですが、一応パッチです。 Index: thread.c =================================================================== --- thread.c (revision 17818) +++ thread.c (working copy) @@ -3515,6 +3515,7 @@ int found = 0; if (vm_living_thread_num(vm) > vm->sleeper) return; + if (vm_living_thread_num(vm) == 1) return; if (vm_living_thread_num(vm) < vm->sleeper) rb_bug("sleeper must not be more than vm_living_thread_num(vm)"); st_foreach(vm->living_threads, check_deadlock_i, (st_data_t)&found); あと 1.8 と挙動が違うといえば。 [ruby-dev:34856] に返事がなかったのですが、1.8 は以下が終了するのに m = Mutex.new Thread.new { m.lock }.join m.lock 以下が sleep forever になるのはおかしくないでしょうか。 m = Mutex.new Thread.new { m.lock; sleep 2 } sleep 1; m.lock 1.9 では下の例でも終了するようにしています。 これを 1.8 にあわせるのは難しそうです。 -- Yusuke ENDOH