任意のオブジェクトにMutexの機能を与える mix-in。 次のような特徴がある。
サンプルを以下に示す。
require 'mutexm'
class Balance
include MutexM
def initialize(f,b)
@foo = f
@bar = b
super
end
synchronize_reader(:foo, :bar)
def move(d)
@foo = @foo + d
@bar = @bar - d
[@foo, @bar]
end
synchronized :move
end
foo = Balance.new(10, 0)
p foo.move(5)
1.0.1
0.9.2
0.9.1
0.9
MutexM.initializeMutexMを初期化する
MutexM.mu_initializeMutexMを初期化する
MutexM.synchronize_reader(name)synchronizeする attr_reader(name) を定義する。
MutexM.synchronize_writer(name)synchronizeする attr_writer(name) を定義する。
MutexM.synchronize_accessor(name)synchronizeする attr_accessor(name) を定義する。
MutexM.lock_reader(name)lockしていないと例外となる attr_reader(name) を定義する。
MutexM.synchronize_writer(name)lockしていないと例外となる attr_writer(name) を定義する。
MutexM.synchronize_accessor(name)lockしていないと例外となる attr_accessor(name) を定義する。
MutexM.synchronized(methodname)メソッド methodname を改名し、synchronize するメソッドを 定義する。元のメソッドは _mu_methodname となる。
それぞれ mu_ で始まる同名のメソッドがある。
MutexM#synchronizeオブジェクトをロックし,ブロックを実行する。実行後にロックを開放する。 ただし、自スレッドがロック中の場合、synchronize はロックの状態を 変化させず、ブロックを実行する。二重に synchronize しても、内側の synchronize はロックを変化させない。
MutexM#locked?ロックされている場合、真を返す。
MutexM#try_lockロックしようとして、ロックが成功した場合、真を返す。ロックできなかった 場合にはブロックせず偽を返す。
MutexM#lockオブジェクトをロックする。一度に一つのスレッドだけがロックできる。 既にロックされているオブジェクトに対してロックを行おうとしたスレッドは ロックが開放されるまでブロックする。
MutexM#unlockロックを開放する。ロック待ちになっていたスレッドの実行は再開される。
MutexM#in_synchronize自スレッドがロックしていない場合、例外を発生させる。ロックしていることの 表明となる。
Copyright (c) 2000-2001 Masatoshi SEKI m_seki@mva.biglobe.ne.jp