越水です。 From: ARIMA Yasuhiro <fit0298 / fitec.co.jp> Subject: [ruby-list:19678] Re: Mutex#synchronize Date: Sun, 19 Dec 1999 18:21:31 +0900 > Mutex#synchronize は、thread の間の排他制御に用います。 > 越水さんの例では、meth_in の @lock.synchronize {} はけっして実行できません。 [ruby-list:19677]のコードを次のように書き換えたら、大丈夫でした: require 'thread' class Foo def meth_out Mutex.new.synchronize { meth_in } end def meth_in Mutex.new.synchronize { p true } end end Foo.new.meth_out [ruby-list:19677]の質問の意図は、『アトミックなメソッドからアトミック なメソッドを呼び出すにはどうすれば良いか?』ということだったんですけど、 Mutexは、上のコードのように使うのが普通なのでしょうか? Javaの話で恐縮ですが、Javaで書くと次のようになります: class Foo { public static void main(String[] args) { new Foo().meth_out(); } synchronized void meth_out() { meth_in(); } synchronized void meth_in() { System.out.println(true); } } [ruby-list:19677]のコードは、このJavaの書き方を真似たものです。 RubyのMutex#synchronizeは、同じスレッドであっても、同じMutexのロックを 得ることはできず、それがデッドロックを引き起こしているということは理解 できました。 越水 greentea / fa2.so-net.ne.jp