From: Masaya TARUI Date: 2010-05-13T22:19:42+09:00 Subject: [ruby-dev:41310] Re: MonitorMixin::ConditionVariable#wait timeout 2010年5月12日23:39 Tanaka Akira : > 2010年5月11日19:17 Masaya TARUI : > >> 3秒間Mutexを開放するという需要はリソースを独占しないという点からあるのですが、 >> 別にsignalですぐ終了する必要がありませんでした。 >> ちょっと考えるとConditionVariableで実現する必要はなく、 >> sleep 3 until m.synchronize do >> if !predicate >> #定期処理 >> end >> predicate >> end >> あたりで十分です。 > > このスレッドはどうやって終了させるんでしょうか。 元の例に一番近い形では m.synchronize { predicate = ture } です。 すばやく止めたいならばpredicateを持たずに、 m.synchronize { th.raise HogeInterrupt } とか仮に外部割込みの制御が入ったら th.raise HogeInterrupt だけでもいいはずです。 > [ruby-core:27698] の Hongli Lai はそこで ConditionVariable を使っている > ように思えます。 「3 秒ごとに定期処理、シグナルされたらすぐに終了」に対応して、 書いてしまいしまいましたが、こちらも本当にもしシグナルされたらすぐ終了でよいのなら mutexを取りに行くConditionVariableは効率が悪いので違う仕組みを使った方が良いでしょう。 多分違うはずで、そこが私が一番勘違いしていた点だと思います。きっとpredicateによってMutex内で処理を行うのでしょう。 元の題材が、シグナルを受けた時に predicateによってMutex内で新しい処理を行うとするならば、それに対応した 「3 秒はリソースを開放して定期処理、シグナルされたらすぐに終了」では、多分ですが、無制限のwaitとタイマー割込みを組み合わせた処理を書きます。 -- 樽家昌也(Masaya TARUI) No Tool,No Life.