From: keiju@... (Keiju ISHITSUKA) Date: 1997-01-31T13:53:18+09:00 Subject: [ruby-list:1991] Mutex_m けいじゅ@SHLジャパンです. Mutexのモジュール版(Mutex_m)を公開します. モジュールはmutex_m.rbのまま でもいいですし, thread.rbに入れて下さってもかまいません. このモジュールは, クラス変数Lockedを使って待ちに入っているスレッドを保 持しています. Lockedはハッシュでキーはこのモジュールをエクステンドした オブジェクトのidとなっています. Locked -> [aMutex1=>[thread1, ...], aMutex2=>[...]] # 今議論されているハッシュ の仕様に関わりなく, キーをオブジェクトidに # しなくてはならないのでリリースすることにしました. オリジナルのMutexクラスはインスタンス変数で情報を保持していましたので, Mutexクラスより若干性能は落ちますが, オブジェクトの(ロック)管理が楽に はなっていると思います. あと, メソッド名の競合についてはまだ対応していません. 名前が一般的なの で気になるは気になりますので, ある程度の競合の対応に関しては, object_extendの仕様が変更され次第対応しようと思っています. 使い方は以下のようになります. require "mutex_m.rb" obj = Object.new obj.extend Mutex_m obj.lock obj.unlock ... 後はMutexと同じ使い方... # ソースの後に幾つか質問があります. --ここから-- # # mutex_m.rb - # $Release Version: 0.9$ # $Date: 97/01/31 13:05:03 $ # # -- # Usage: # require "mutex_m.rb" # obj = Object.new # obj.extend Mutex_m # ... # 後はMutexと同じ使い方 # module Mutex_m Locked = Hash.new def locked? Locked.key?(self.id) end def try_lock Thread.critical = TRUE if Locked.key?(self.id) ret = FALSE else Locked[self.id] = [] ret = TRUE end Thread.critical = FALSE ret end def lock while (Thread.critical = TRUE; w = Locked[self.id]) w.push Thread.current Thread.stop end Locked[self.id] = [] Thread.critical = FALSE self end def unlock Thread.critical = TRUE if wait = Locked.delete(self.id) Thread.critical = FALSE for w in wait w.run end else Thread.critical = FALSE end self end def synchronize begin lock yield ensure unlock end end end -- ここまで -- 質問: [1] lockについて def lock while (Thread.critical = TRUE; w = Locked[self.id]) w.push Thread.current Thread.stop end Locked[self.id] = [] Thread.critical = FALSE self end whileのなかで Thread.critical = TRUEをしたまま Thread.stopしますが, Thread.stopすると, Thread.criticalはFALSEになるものなのですか? それと も, この状態はThread毎に持っている? [2] Thread.critical = TRUE としなくては行けなくなるのはどういう時なのでしょう? つまり, スレッドの スイッチの粒度はどのくらいなのでしょう? それとかかわるのですが, 共有オブジェクトにアクセスする時には必ず Thread.critical = TRUEとしなくてはいけない? それとも書き込む時だけでしょ うか? 上記の例だと: def locked? Locked.key?(self.id) end がありますが, 問題ありますか? [3] lockのタイムアウト これはMutexの仕様にも関わるのですが, lockのタイムアウトも指定できた方 が嬉しい時もあると思うのですが... 実現は面倒ですね(^^;;; __ .........................................石塚 圭樹@SHLジャパン(株)... ------------>アドレス変わりました!! e-mail: keiju@shljapan.co.jp <----