原です。

Mutex で deadlock を起こすので、原因を探っていたんですが、

  def lock
    while not try_lock
      @waiting.push Thread.current
      Thread.stop
    end
  end

で、try_lock が FALSE となり、Thread.current を push する
直前に lock をかけていたスレッドが unlock したばあい、自分
を再 start してくれる機会がなくなって、いずれ deadlock に
なりそうです。したがって、try_lock を込みで exclusive にす
べきですね。こんな風に。

  def lock
    loop do
      Thread.exclusive do
	if not @locked
	  @locked=TRUE
	  return
	end
	@waiting.push Thread.current
      end
      Thread.stop
    end
  end

で、ここでもやはり class Queue と同様に Thread.stop する前に
に run が済んでしまう事が起こり得ます。いずれ deadlock が起
こりそうです。結局 Mutex#unlock, Queue#push ともに、スレッド
がちゃんと stop するのを待って run すれば、全て解決しそうで
すが?


それから前回 Hash では参照も排他的にやらなければならないので
は?と思いましたが、変な例をみつけて、また分からなくなってし
まいました。
---===-=-=-=-=-=-=-=-=======--=-=-=-==-=-===-=-=-=-=-=-=--=-==-=--
                            Shin-ichro Hara(Nagaoka Univ.of Tech.)