前田です。

At Fri, 4 Jun 1999 22:09:16 +0900,
Shin-ichiro Hara <sinara / blade.nagaokaut.ac.jp> wrote:
> ふーむ。monitor.rb は私にとって幾つか謎があります。
> 
> 例えば Thread#run が一つも無くて、Thread#wakeup のみが使われている
> こと。これも、スケジューリング問題の調整のためでしょうか。あとロッ
> クの owner という概念があって、そこかしこに、owner がずれてると例外
> を発生させる様になっているところとか。owner はカウントつきロックの
> ためにだけあるのでは無いようですね。

[ruby-list:6791]あたりにその辺の理由が書いてあります。
簡単に言うとsignal/broadcastされた時点でwaitしたスレッドが優先的
にロックを獲得できるようにするためです。

あと、wakeupを使っているのはスケジューリングが起こって欲しくない
からですね。

> 私はスレッドに関するプログラムがちゃんと動くかどうか検証するのに
> あちこちに(critical である所とか、キューに回って Thread.stop した
> 直後とかは避けて)Thread.pass を入れて強制的にスレッドの切替を起こ
> してみるのですが、monitor.rb で問題になりそうな所でやってみました。
> 
> まず monitor.rb コピー mon-test.rb を取ります。:-)
> そして、253行目あたり、クリティカルセクションが終った所で pass さ
> せます。
(snip)
> するとやはり dead lock が起こります。(Linux です。)

う、手元のmonitor.rbの253行目はスクリプトの終わりになってます(^_^;
なんかこの間バグを一つつぶしたような気がする(夢だったかも)ので
ruby-1.3.4付属のもので試していただけませんか?

-- 
前田 修吾