原です。
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.)