[#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:41358] Re: MonitorMixin::ConditionVariable#wait timeout

From: Tanaka Akira <akr@...>
Date: 2010-05-19 14:21:11 UTC
List: ruby-dev #41358
2010年5月16日0:27 Masaya TARUI <tarui@prx.jp>:

>> えー、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]

In This Thread