要約
スレッドの同期機構としてのモニター機能を提供するクラスです。また同じスレッドから何度も lock できる Mutex としての機能も提供します。
MonitorMixin を include し、いくつかの別名を定義したクラスです。
例
消費者、生産者問題の例require'monitor'buf=[]mon=Monitor.newempty_cond= mon.new_cond# consumerThread.startdoloopdo mon.synchronizedo empty_cond.wait_while{ buf.empty?}print buf.shiftendendend# producerwhile line=ARGF.gets mon.synchronizedo buf.push(line) empty_cond.signalendend2回ロックしてもデッドロックにならない例です。
デッドロックにならない例require'monitor'mon=Monitor.newmon.synchronize{ mon.synchronize{}}Thread::Mutex ではデッドロックになります。
Mutex でデッドロックになる例mx=Mutex.newmx.synchronize{ mx.synchronize{}}# => deadlock; recursive locking (ThreadError)目次
- 特異メソッド
- インスタンスメソッド
特異メソッド
new -> Monitor[permalink][rdoc][edit]新しい Monitor オブジェクトを生成します。
インスタンスメソッド
enter -> ()[permalink][rdoc][edit]mon_enter -> ()モニターをロックします。
一度に一つのスレッドだけがモニターをロックできます。既にモニターがロックされている場合は、ロックが開放されるまでそのスレッドは待ちます。
Thread::Mutex#lock に相当します。Thread::Mutex#lock と違うのは現在のモニターの所有者が現在実行されているスレッドである場合、何度でもロックできる点です。ロックした回数だけMonitor#exit を呼ばなければモニターは解放されません。
例
require'monitor'mon=Monitor.newmon.entermon.enterThread::Mutex#lock ではデッドロックが起きます。
Mutex でデッドロックする例
m=Mutex.newm.lockm.lock# => deadlock; recursive locking (ThreadError)exit -> ()[permalink][rdoc][edit]mon_exit -> ()モニターのロックを解放します。
enter でロックした回数だけ exit を呼ばなければモニターは解放されません。
モニターが解放されればモニターのロック待ちになっていたスレッドが一つ実行を再開します。
- [EXCEPTION] ThreadError:
- ロックを持っていないスレッドが呼びだした場合に発生します
例
require'monitor'mon=Monitor.newmon.entermon.entermon.exitmon.exitmon.exit# => current thread not owner (ThreadError)mon_check_owner -> nil[permalink][rdoc][edit]MonitorMixin 用の内部メソッドです。
- [EXCEPTION] ThreadError:
- ロックを持っていないスレッドが呼びだした場合に発生します
mon_locked? -> bool[permalink][rdoc][edit]モニターがロックされているときに true を返します。
mon_owned? -> bool[permalink][rdoc][edit]カレントスレッドがモニターをロックしているときに true を返します。
synchronize { ... } -> object[permalink][rdoc][edit]mon_synchronize { ... } -> objectモニターをロックし、ブロックを実行します。実行後に必ずモニターのロックを解放します。
ブロックの評価値を返り値として返します。
[SEE_ALSO]Monitor#enter
try_enter -> bool[permalink][rdoc][edit]try_mon_enter -> boolmon_try_enter -> boolモニターのロックを取得しようと試みます。ロックに成功した(ロックが開放状態だった、もしくはロックを取得していたスレッドが自分自身であった)場合には真を返します。
ロックができなかった場合は偽を返し、実行を継続します。この場合にはスレッドはブロックしません。
new_cond -> MonitorMixin::ConditionVariable[permalink][rdoc][edit]モニターに関連付けられた、新しいMonitorMixin::ConditionVariable を生成して返します。
wait_for_cond(cond, timeout) -> bool[permalink][rdoc][edit]MonitorMixin::ConditionVariable 用の内部メソッドです。
- [PARAM] cond:
- Thread::ConditionVariable を指定します。
- [PARAM] timeout:
- タイムアウトまでの秒数。指定しなかった場合はタイムアウトしません。
- [RETURN]
- タイムアウトしたときは false を返します。それ以外は true を返します。
例
require'monitor'm=Monitor.newcv=Thread::ConditionVariable.newm.enterm.wait_for_cond(cv,1)