[#41278] [BUG:1.9] BINARY should not be ASCII-compatible — Yugui <yugui@...>

WXVndWkbJEIkRyQ5ISMbKEIKCgo+IBskQiRHISIkKiQqJGAkTSQzJDMkXiRHJE41RE9AJEclKyVQ

15 messages 2010/05/11

[#41407] [Bug #3339] win32ole test failure — Usaku NAKAMURA <redmine@...>

Bug #3339: win32ole test failure

20 messages 2010/05/25
[#41411] Re: [Bug #3339] win32ole test failure — Masaki Suketa <masaki.suketa@...> 2010/05/25

助田です。

[#41412] Re: [Bug #3339] win32ole test failure — "U.Nakamura" <usa@...> 2010/05/25

こんにちは、なかむら(う)です。

[ruby-dev:41310] Re: MonitorMixin::ConditionVariable#wait timeout

From: Masaya TARUI <tarui@...>
Date: 2010-05-13 13:19:42 UTC
List: ruby-dev #41310
2010年5月12日23:39 Tanaka Akira <akr@fsij.org>:
> 2010年5月11日19:17 Masaya TARUI <tarui@prx.jp>:
>
>> 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.

In This Thread