原です。

In message "[ruby-list:14473] Re: ConditionVariable (thread.rb)"
    on 99/05/24, Shugo Maeda <shugo / netlab.co.jp> writes:
|
|前田です。

|というかpthreadなどに合わせただけです。

あ、そうなんですね。

|そもそも条件変数は特定のロックとセットで使うものなので、
|
|cond = ConditionVariable.new(mutex)
|
|のように生成時に指定するようにした方がいいかもしれません。

そう、その方がいい感じではありますね。昔はそいういう仕様を前田さん
も提案していた。しかし

  def enq(v)
    @mutex.synchronize {
      @full.wait(@mutex) if count == @max 
      ...
    }
  end

の所を

  def enq(v)
    @mutex.synchronize {
      @full.wait if count == @max 
      ...
    }
  end

と書けるようになると synchronize と wait が同じ @mutex を扱って
いることが隠れてまた見難い気もします。

|でも、ロックの解放をユーザまかせにするのはあまりスマートではない
|ような気がします。
|ロックの解放と再獲得を自動的にやってくれるのは条件変数の肝の部分
|だと思うので。

なるほど、そういえばそうですね。では、

  cond = ConditionVariable.new(mutex)

という仕様で、

  def enq(v)
    @full.synchronize {
      @full.wait if count == @max 
      ...
    }
  end

みたいに ConditionVariable#synchronize を作るのはいかが?

あるいは ConditionVariable に mutex がどうしてもつきものだ
と考えるならば、いっそ Mutex を継承してしまうとか。