From: Yukihiro Matsumoto Date: 2008-01-10T17:54:47+09:00 Subject: [ruby-dev:33005] Re: queue and timeout まつもと ゆきひろです In message "Re: [ruby-dev:33004] Re: queue and timeout" on Thu, 10 Jan 2008 17:44:13 +0900, Kazuhiro NISHIYAMA writes: |> * 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#sleepでMutexは解放するんですよ。ただ、mutex->th を0クリアしないというだけで。 |Mutex#unlockの変わりに例外を起こさないMutex#try_unlockを追加して |使うというのはどうでしょうか? そっちがいいのかなあ。あるいは unlock に rescue を付けちゃう か。ただ、並列プログラミング素人の私が手を出すとやけどしちゃ いそう。