けいじゅ@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 <----