要約
スレッド同期機構である Thread::Mutex のモジュール版です。クラスに Module#include することでそのクラスに Mutex 機能を持たせることができます。また、普通のオブジェクトを Object#extend により Mutex にする事ができます。
このモジュールによるロックは再入不可能です。再入可能な同等品が必要な場合は
MonitorMixin の利用を検討してください(sync ライブラリの Sync_m は
Ruby 3.0 で標準添付から削除されました。sync gem をインストールすれば利用できます)。ただし MonitorMixin は単純な再入可能ロックであり、Sync_m が持っていた
reader/writer(共有・排他)ロックの区別はありません。
「mu_」の付かないメソッド(Mutex_m#lock, Mutex_m#synchronize, Mutex_m#locked?, Mutex_m#try_lock, Mutex_m#unlock) はモジュールにincludeした場合には定義されません。
例
クラスに Module#include する例
require "mutex_m"
class Foo
include Mutex_m
# ...
end
obj = Foo.new
obj.synchronize do
# 危険領域(critical section)
# ...
end
オブジェクトに Object#extend する例
require "mutex_m"
obj = Object.new
obj.extend(Mutex_m)
obj.lock
# 危険領域(critical section)
...
obj.unlock
目次
- 特異メソッド
- インスタンスメソッド
特異メソッド
append_features(klass) -> Class | nil[permalink][rdoc][edit]-
ユーザが直接、使うことはありません。
[SEE_ALSO] Module#append_features
define_aliases(klass) -> Class[permalink][rdoc][edit]-
ユーザが直接、使うことはありません。
extend_object(module) -> Module[permalink][rdoc][edit]-
ユーザが直接、使うことはありません。
[SEE_ALSO] Module#extend_object
インスタンスメソッド
mu_lock -> ()[permalink][rdoc][edit]lock -> ()-
self をロックします。一度にひとつのスレッドしかロックできません。既にロックされている mutex に対してロックを行おうとしたスレッドはロックが解放されるまで、実行が停止されます。
mu_locked? -> bool[permalink][rdoc][edit]locked? -> bool-
self がロックされている時、真を返します。
mu_extended -> Mutex[permalink][rdoc][edit]-
Mutex_m.extend_object から呼び出されます。ユーザが直接使うことはありません。
mu_synchronize { ... } -> object[permalink][rdoc][edit]synchronize { ... } -> object-
self のロックを取得し、ブロックを実行します。実行後に必ずロックを解放します。
ブロックで最後に評価した値を返します。
mu_try_lock -> bool[permalink][rdoc][edit]try_lock -> bool-
self をロックしようとして、成功した場合、真を返し、ロックを得ます。
ロックできなかった場合にはブロックせず偽を返します。
mu_unlock -> ()[permalink][rdoc][edit]unlock -> ()-
ロックを解放します。ロック待ちになっていたスレッドの実行は再開されます。
- [EXCEPTION]
ThreadError: - ロックされていない場合に unlock を呼ぶと発生します
- [EXCEPTION]