前田です。 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と同程度の機能になっています。 # 動作原理も同じはずなんですけど...。 -- 前田 修吾