原です。

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 の
事情なのかもしれません。