前田です。

At Mon, 7 Jun 1999 18:17:50 +0900,
Shin-ichiro Hara <sinara / blade.nagaokaut.ac.jp> wrote:
> そうですね。だから、ユーザーの条件変数の一般的利用法としては、
(snip)
> mutex.synchronize {
>   ...
>   while ある条件
>     cond_var.wait(mutex)
>   end
>   ...
> }
> 
> と書くべきなんですね。せきさんのプログラムでは前者で十分だけど。

ですね。

> monitor.rb では、signal のスレッドから1周する間に競合するス
> レッドの幾つかを止めて回るので、2周目、sinal のスレッドから
> wait のスレッドに移動する間に邪魔される確率が減る、またそこ
> でロックを横取りされても優先的に取り戻すので同じスレッドに2
> 度邪魔されることは殆んどない(1度はあるかもしれないが)、と
> いう様なメカニズムでしょうか。

そうです。

> 実験:
> 
> -----^ test1.rb
(snip)
> これを実行すると $waste == $waste1 で一桁ぐらいです。
> これを cv2.rb の ConditionVariable で書くと $waste1 が
> 数倍、$waste は数十倍。かなり違うものですね。

うちで試したらmonitorの方も二桁でした。
しかもmonitorの方が遅い(^_^;

monitor.rb版
studly[ruby]$ time ruby test1.rb
21, 21

real    0m6.421s
user    0m6.320s
sys     0m0.020s

cv2.rb版
studly[ruby]$ time ruby test2.rb
489, 36

real    0m4.952s
user    0m4.930s
sys     0m0.010s

ちなみにCで書いたmutexライブラリでは、

studly[ruby]$ time ruby test3.rb
0, 0

real    0m2.041s
user    0m2.010s
sys     0m0.030s

という結果でした。

# このMutexは実は再帰ができるようになっているので、実質的には
# monitor.rbと同程度の機能になっています。
# 動作原理も同じはずなんですけど...。

-- 
前田 修吾