From: Kazuhiro NISHIYAMA Date: 2008-01-10T17:44:13+09:00 Subject: [ruby-dev:33004] Re: queue and timeout 西山和広です。 At Thu, 10 Jan 2008 02:51:11 +0900, Yukihiro Matsumoto wrote: > > 追いかけてみました。 > > * Queue#popがMutex#synchronizeのブロック中でMutex#sleepを呼ぶ > * Mutex#sleepがrb_mutex_unlock()を呼ぶ > * ここでTimeout > * Mutex#synchronizeが中断。ensureでMutex#unlockが呼ばれる > * すでにunlockされているのでThreadError例外 > * Timeout::Error例外は無視されちゃう > > という流れのようです。ちょっと考えると > > * Mutex#sleepはmutex->thをクリアしない > * Mutex#unlockはmutex->th==0の時例外を起こさない > > などの対応が考えられますが、副作用が気になります。 同じくちょっと考えただけですが、Mutex#sleepでMutexを解放しないと Queue#pushができないのではないでしょうか? Mutex#unlockの変わりに例外を起こさないMutex#try_unlockを追加して 使うというのはどうでしょうか? -- |ZnZ(ゼット エヌ ゼット) |西山和広(Kazuhiro NISHIYAMA)