From: "kosaki (Motohiro KOSAKI)" Date: 2012-09-09T20:34:00+09:00 Subject: [ruby-dev:46125] [ruby-trunk - Bug #6911] Sync_m#sync_unlock で ThreadError が発生する場合がある Issue #6911 has been updated by kosaki (Motohiro KOSAKI). 余談なんですけど、なんで Mutex.sleep を thread.run で起こせる仕様なんでしたっけ? Thread.stop, Thread.sleep 以外は起こせないほうが普通の感覚かと思うのですが。 とはいえ、スレッドライブラリはTimeout moduleとかでexeptionが突然飛んできても大丈夫なように書いてあるべきなので、この制限をいれてもSync_mを直さないといけないという結論は変わらないのですが ---------------------------------------- Bug #6911: Sync_m#sync_unlock で ThreadError が発生する場合がある https://bugs.ruby-lang.org/issues/6911#change-29226 Author: mrkn (Kenta Murata) Status: Closed Priority: Normal Assignee: Category: lib Target version: 2.0.0 ruby -v: ruby 2.0.0dev (2012-08-23 trunk 36795) [x86_64-darwin11.4.0] Sync_m#sync_unlock で ThreadError が発生する場合があります。 原因は Sync_m#sync_lock が同一スレッドを複数回 sync_waiting 配列に push してしまうからです。 同一スレッドが多重に sync_waiting 配列に入っていると、sync_unlock の中で何度もそのスレッドに対して Thread#run が呼ばれます。 すると、1回目の Thread#run でそのスレッドが終了した場合、2回目の Thread#run で ThreadError が発生します。 sync_waiting に同一スレッドが複数回 push された状態を再現するコードを gist に置きました。 https://gist.github.com/3434046 この gist に添付されてる test を実行すると、以下のような結果が得られると思います。 [1/1] SyncTest#test_synchronize = 0.51 s 1) Failure: test_synchronize(SyncTest) [/Users/kenta-murata/work/ruby.git/test/test_sync.rb:57]: <[#, #, #]> expected but was <[#, #, #, #]>. 修正用のパッチも上記 gist に添付してあります。修正方法がこの通りで良ければコミットしたいので、どなたかレビューをお願いします。 -- http://bugs.ruby-lang.org/