From: Tanaka Akira Date: 2010-05-19T23:21:11+09:00 Subject: [ruby-dev:41358] Re: MonitorMixin::ConditionVariable#wait timeout 2010年5月16日0:27 Masaya TARUI : >> えー、Thread#raise を使うんですか。 >> >> Thread#raise は剣呑なので、避けたほうがいいと思います。 >> ConditionVariable で避けられるのに、あえて Thread#raise が必要な方法を >> とるのはよろしくないんじゃないでしょうか。 > > どのみちConditionVariableでThread#raiseを使ってませんでしたっけ?と思ったら時間指定している時だけですね。 使っていないように思うんですが、どこで使ってますか? > ConditionVariableとほぼ同じになりますが、 > m.synchronize { predicate = ture ; th.run } > がよいでしょうか? これは race condition がありますね。 問題のスレッドがロックを外した後、sleep する前に コンテキストスイッチして th.run が動くと、 その th.run は無視されて、寝てしまうんじゃないでしょうか。 > もちろん、Thread#raiseを取り巻く今の仕様の悪さは理解してるので何も考えずに使うのはどうかと思いますが、 > 状況次第ではないでしょうか? > ConditionVariable はmのロック状況次第でどれだけ遅延するか分からないので、 > Thread#raiseとどちらがいいかは状況によって変わると思います。 > 剣呑といっても正しく使う分には便利な制御です。 定期的な処理 ([ruby-core:27698] でいえば cleaning function) を実行している 最中は中断したくないとすると、Thread#raise を使う場合でも m をロックしないと いけないでしょう。 [ruby-dev:41310] で Thread#raise を m.synchronize のブロックの中に入れてある のはそういうことだと思っていたんですが違うんでしょうか。 定期的な処理の最中でも中断したい、という要求はありえますが、 それは今回の ConditionVariable の話とは異なる要求だと思います。 -- [田中 哲][たなか あきら][Tanaka Akira]