任意のオブジェクトにMutexの機能を与える mix-in。
次のような特徴がある。
- Mutexと同様にオブジェクトに対してlock/unlock/synchronizeできる。
- lock中のスレッドがsynchronize可能である。synchronizeの前後でlockの
状態は変化しない。
- synchronizeする attr_reader/writer/accessor を定義できる。
- lockしていないと例外を発生する attr_reader/writer/accessor を定義できる。
- メソッドを改名し synchronize でくるんだ同名のメソッドを定義できる。
サンプルを以下に示す。
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
- initializeをmu_initializeに分割。[ruby-dev:13467]
0.9.2
- 違うスレッドがunlockできるバグの修正。
- lock待ちのスレッドがkillされた場合の対応。
0.9.1
- synchronize_reader/writer/accessor, lock_reader/writer/accessor,
synchoronized で複数の名前を同時に指定できるようにした。
- initializeしなくても動作するようにした。教育的(?)にどうかは疑問。
0.9
MutexM.initialize
-
MutexMを初期化する
MutexM.mu_initialize
-
MutexMを初期化する
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