From: Masaya TARUI Date: 2010-05-16T00:27:16+09:00 Subject: [ruby-dev:41323] Re: MonitorMixin::ConditionVariable#wait timeout 2010年5月15日18:43 Tanaka Akira : > 2010年5月13日22:19 Masaya TARUI : > >>> このスレッドはどうやって終了させるんでしょうか。 >> >> 元の例に一番近い形では >> m.synchronize { predicate = ture } >> です。 >> すばやく止めたいならばpredicateを持たずに、 >> m.synchronize { th.raise HogeInterrupt } >> とか仮に外部割込みの制御が入ったら >> th.raise HogeInterrupt だけでもいいはずです。 > > えー、Thread#raise を使うんですか。 > > Thread#raise は剣呑なので、避けたほうがいいと思います。 > ConditionVariable で避けられるのに、あえて Thread#raise が必要な方法を > とるのはよろしくないんじゃないでしょうか。 どのみちConditionVariableでThread#raiseを使ってませんでしたっけ?と思ったら時間指定している時だけですね。 ConditionVariableとほぼ同じになりますが、 m.synchronize { predicate = ture ; th.run } がよいでしょうか? もちろん、Thread#raiseを取り巻く今の仕様の悪さは理解してるので何も考えずに使うのはどうかと思いますが、 状況次第ではないでしょうか? ConditionVariable はmのロック状況次第でどれだけ遅延するか分からないので、 Thread#raiseとどちらがいいかは状況によって変わると思います。 剣呑といっても正しく使う分には便利な制御です。 >>> [ruby-core:27698] の Hongli Lai はそこで ConditionVariable を使っている >>> ように思えます。 >> >> 「3 秒ごとに定期処理、シグナルされたらすぐに終了」に対応して、 >> 書いてしまいしまいましたが、こちらも本当にもしシグナルされたらすぐ終了でよいのなら >> mutexを取りに行くConditionVariableは効率が悪いので違う仕組みを使った方が良いでしょう。 >> 多分違うはずで、そこが私が一番勘違いしていた点だと思います。きっとpredicateによってMutex内で処理を行うのでしょう。 >> 元の題材が、シグナルを受けた時に predicateによってMutex内で新しい処理を行うとするならば、それに対応した 「3 >> 秒はリソースを開放して定期処理、シグナルされたらすぐに終了」では、多分ですが、無制限のwaitとタイマー割込みを組み合わせた処理を書きます。 > > すみません。何回か読んだんですが、よく分かりませんでした。 課題を誤解していた部分がありました。という趣旨です。蛇足だったかもしれません。 -- 樽家昌也(Masaya TARUI) No Tool,No Life.