前田です。

In message "[ruby-list:6816] Re: Mutex/ConditionVariable/Queue"
石塚圭樹 <keiju / rational.com> wrote:

|>考えてみたんですけどMixinにしようかなと思います。
|
|つまり, 本家Mutexとは別クラスにするという話ですね?

はい。

|1. extendだけでなく, includeでも使えるようにしてください.

一応そうするつもりです。
組み込みクラスの場合、

class MyString < String
  include MonitorMixin
  def self.new(s)
    obj = super(s)
    obj.mon_initialize
    return obj
  end
end

のようにnewをオーバーライドしないといけないのですが。
# append_featuresでnewの定義を変えてしまえばよいのかな...。

|2. ConditionVariable#wait
|
|  while 条件
|    cond.wait
|  end
|
|という使い方が多いのでしたら, イテレータもあるといいかも. 1.1b9からつ
|かえる 
|
|  cond.while{条件} or cond.until{条件}
|
|がいいかな(^^;;;

Smalltalkみたいですね:-)
wait_while/wait_untilにしようと思います。
QueueをMonitorMixinで書くとこんな感じになる予定です。

class Queue
  include MonitorMixin

  def initialize
    @que = []
    @empty_cond = new_condition_variable
  end

  def push(obj)
    synchronize {
      @que.push(obj)
      @empty_cond.signal
    }
  end

  def pop
    synchronize {
      @empty_cond.wait_while { @que.empty? }
      return @que.shift
    }
  end
end

|# extendableにするという話でしたが, 私除経験からだと結構いろいろ対応し
|# なくてはいけないので(Mutex_m/Sync_m)結構大きくなるかも, すると 
|# thread.rbに統合するのは無理があるかも?

monitor.rbにしようかなと思ってます。

|Queue/SizedQueueの実装がずいぶん簡単になるなと感心してしまいました. 特
|に, あんなに苦労したSizedQueue#max= があんなに簡単になったのは感動しま
|した.

実はbroadcastだとpushした順番通りになるとは限らないのですが(^^;

-- 
前田 修吾