越水です。

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