原です。
In message "[ruby-list:14815] Re: ConditionVariable (again)"
on 99/06/04, Yukihiro Matsumoto <matz / netlab.co.jp> writes:
|
|まつもと ゆきひろです
||thread.rbのConditionVariableをこれに置き換えませんか?>まつもとさん
|
|前田さん,修正してcheck-inしてくださいませ.
おお!ところで Thread.exclusive も入ったんでしょうか?
えーと、まつもとさん、覚えていますかね、昔は Thread.critical は
無くて、Thread.exclusive{} が有ったんですね。しかしいまいち調子
が良くないってんで、廃止になったんでした。
cf. [ruby-list:1764]
私は Thread.exclusive を復活させたらいいんじゃないかと思うんで
すよ。というのは、、、
Mutex を使うのは
1. あるリソースの操作を排他処理したい
時だとよく言われますが、もうひとつ大事な条件として
2. しかしそのリソースの操作をしないスレッドは動き続けてほしい
時、というのがあると思います。むしろ 2. が重要なのではないかと。
1. であって 2. でないなら Thread.exclusive を使えばいいんだから。
例えば「チュートリアル」の mutex を使う例に、
1 require "thread"
2
3 m = Mutex.new
4 v = 0;
5
6 Thread.start {
7 while TRUE
8 m.synchronize {
9 v = v + 100
10 }
11 end
12 }
13
14 while TRUE
15 m.synchronize {
16 v = v - 33
17 }
18 end
というのがありますが、ここでは v = v + 100 の評価の最中に他のス
レッドに動いて欲しい気は全くしないわけです。(いや、そう思う人
もいるかもしれないけど。)ですから、ここの m.synchronize は全て、
Thread.exclusive でるある方がプログラムとしてより良いという気が
する。その方がずっと軽いし。
mutex を使う例としては、ブロックで他のスレッドに行ってしまうとか、
時間のかかる処理をさせる、とかいう方が本筋ではないでしょうか。
で、そいう mutex が必要でない時のために Thread.exclusive はあっ
た方がいいと思うわけです。
もっとも、多分まつもとさんは、Thread.critical とか、Thread.exclusive
とかいうプリミティブな命令は、ユーザーから隠したいという意向がある
のではないかと思います。それでマニュアルには載っていないのだと想像
しています。
また、この例の様なケースで Mutex を使うのは結構一般的なんですよ
ね。Thread.exclusive の方がいいというのは、一般的でない Ruby の
事情なのかもしれません。