前田です。

At Mon, 24 May 1999 17:50:26 +0900,
Shin-ichiro Hara <sinara / blade.nagaokaut.ac.jp> wrote:
> |そもそも条件変数は特定のロックとセットで使うものなので、
> |
> |cond = ConditionVariable.new(mutex)
> |
> |のように生成時に指定するようにした方がいいかもしれません。
> 
> そう、その方がいい感じではありますね。昔はそいういう仕様を前田さん
> も提案していた。

そういえば、thread.rbにConditionVariableを入れるかわりに、
monitor.rbを書いたような記憶があるのですが、thread.rbに
ConditionVariableが入ってますね。
これは私が書いたのでしたっけ?

>   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 を扱って
> いることが隠れてまた見難い気もします。

うーん、でも、コードを書く人にとっては自明なはずですし、逆に読む
人にとっては(その部分に問題がないかぎり)気にしなくていい部分なの
ではないでしょうか。

>   def enq(v)
>     @full.synchronize {
>       @full.wait if count == @max 
>       ...
>     }
>   end
> 
> みたいに ConditionVariable#synchronize を作るのはいかが?

うーん、そこまでいくとそれはもはや条件変数とは呼ばないような。
排他制御したいのは「バッファがいっぱいになっている」という条件で
はないので、やはり / full.synchronize {...}というのは無理があるので
はないでしょうか。

Javaだとオブジェクトとロックと条件変数が一致したモデルになってい
て、(複数の条件で待てないという問題があるにせよ)それはそれでわか
りやすいような気もしますけど。

-- 
前田 修吾