前田です。 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した順番通りになるとは限らないのですが(^^; -- 前田 修吾