原です。

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

|>   def enq(v)
|>     @mutex.synchronize {
|>       @full.wait if count == @max 
|>       ...
|>     }
|>   end
|> 
|> と書けるようになると synchronize と wait が同じ @mutex を扱って
|> いることが隠れてまた見難い気もします。
|
|うーん、でも、コードを書く人にとっては自明なはずですし、逆に読む
|人にとっては(その部分に問題がないかぎり)気にしなくていい部分なの
|ではないでしょうか。

これは感覚的な問題なんで、、、確かに今の仕様で問題はないです。

|>   def enq(v)
|>     @full.synchronize {
|>       @full.wait if count == @max 
|>       ...
|>     }
|>   end
|> 
|> みたいに ConditionVariable#synchronize を作るのはいかが?
|
|うーん、そこまでいくとそれはもはや条件変数とは呼ばないような。
|排他制御したいのは「バッファがいっぱいになっている」という条件で
|はないので、やはり / full.synchronize {...}というのは無理があるので
|はないでしょうか。

その通りで、条件変数とはいい難い感じはしてくるわけだけど、、

つまり、条件変数が mutex と不可分と考えるなら、Mutex の幾つかのメ
ソッドを持っていてもいい気がするし、mutex と別ものとするなら wait
に mutex を(ひとつ)解放するメカニズムを組み込むのは変な気がする
んです。例えば


(あ)
  class ConditionVariable
    def wait(mutex)
      mutex.unlock
      @waiters_mutex.synchronize {
        @waiters.push(Thread.current)
      }
      Thread.stop
      mutex.lock
    end
  end
  ...
  def enq(v)
    @mutex.synchronize {
      @full.wait(@mutex) if count == @max 
      @q.push v
      @empty.signal if count == 1 
    }
  end

は、

(い)
  class ConditionVariable
    def wait2
      @waiters_mutex.synchronize {
        @waiters.push(Thread.current)
      }
      Thread.stop
    end
  end
  ...
  def enq(v)
    @full.wait2 if count == @max 
    @mutex.synchronize {
      @q.push v
      @empty.signal if count == 1 
    }
  end

と書いてもほとんど変わらないわけで、では wait の引数は何に
使われるの?ってことになる。

あれれっ、もしかして(あ)も(い)もデッドロックする?