Ruby 1.9.3 リファレンスマニュアル > ライブラリ一覧 > monitorライブラリ > Monitorクラス

class Monitor + MonitorMixin

クラスの継承リスト: Monitor < MonitorMixin < Object < Kernel < BasicObject

要約

スレッドの同期機構としてのモニター機能を提供するクラスです。 また同じスレッドから何度も lock できる Mutex としての機能も提供します。

MonitorMixin を include し、いくつかの別名を定義したクラスです。

require 'monitor'

buf = []
mon = Monitor.new
empty_cond = mon.new_cond

# consumer
Thread.start do
  loop do
    mon.synchronize do
      empty_cond.wait_while { buf.empty? }
      print buf.shift
    end
  end
end

# producer
while line = ARGF.gets
  mon.synchronize do
    buf.push(line)
    empty_cond.signal
  end
end

2回ロックしてもデッドロックにならない例です。

require 'monitor'
mon = Monitor.new
mon.synchronize {
  mon.synchronize{

  }
}

Mutex ではデッドロックになります。

require 'thread'
mx = Mutex.new
mx.synchronize {
  mx.synchronize{

  }
}
# => deadlock; recursive locking (ThreadError)

特異メソッド

new -> Monitor

新しい Monitor オブジェクトを生成します。

インスタンスメソッド

enter -> ()

MonitorMixin#mon_enter の別名です。

exit -> ()

MonitorMixin#mon_exit の別名です。

mon_enter -> ()

モニターをロックします。

一度に一つのスレッドだけがモニターをロックできます。 既にモニターがロックされている場合は、ロックが開放されるまで そのスレッドは待ちます。

Mutex#lock に相当します。 Mutex#lock と違うのは現在のモニターの所有者が現在実行されているスレッドである場合、 何度でもロックできる点です。ロックした回数だけ mon_exit を呼ばなければモニターは 解放されません。

例:

require 'monitor'
buf = []
buf.extend(MonitorMixin)
buf.mon_enter
buf.mon_enter

Mutex#lock ではデッドロックが起きます。

例:

require 'thread'
m = Mutex.new
m.lock
m.lock # => deadlock; recursive locking (ThreadError)
mon_exit -> ()

モニターのロックを解放します。

mon_enter でロックした回数だけ mon_exit を 呼ばなければモニターは解放されません。

モニターが解放されればモニターのロック待ちになっていた スレッドが一つ実行を再開します。

[EXCEPTION] ThreadError:
ロックを持っていないスレッドが呼びだした場合に発生します
mon_synchronize { ... } -> object
synchronize { ... } -> object

モニターをロックし、ブロックを実行します。実行後に必ずモニターのロックを解放します。

ブロックの評価値を返り値として返します。

[SEE_ALSO] MonitorMixin#mon_enter

mon_try_enter -> bool
try_mon_enter -> bool

モニターのロックを取得しようと試みます。 ロックに成功した(ロックが開放状態だった、もしくは ロックを取得していたスレッドが自分自身であった)場合には 真を返します。

ロックができなかった場合は偽を返し、実行を継続します。この場合には スレッドはブロックしません。

new_cond -> MonitorMixin::ConditionVariable

モニタに関連付けられた、新しい MonitorMixin::ConditionVariable を生成して返します。

try_enter -> bool

MonitorMixin#mon_try_enter の別名です。

class Monitor