けいじゅ@日本ラショナルソフトウェアです.

In [ruby-dev :01523 ] the message: "[ruby-dev:1523] Re: SizedQueue and
some question ", on Feb/24 17:42(JST) Yukihiro Matsumoto writes:

>まつもと ゆきひろです

>|>|SizedQueueで途中で max size が帰られると良いと思ったんですが...
>
>|小さくする時は, @queのサイズがmaxより小さくなるまでスレッドには待って
>|もらえば良いんじゃないですかね? 一時的には@queサイズがmaxよりも大きく
>|なってしまいますが, しょうがないってことで...
>
>まあ,それでもよいでしょう,多分.
>
>|以下の定義はどうでしょう? 待っているスレッドは走り出せば必ず@queにpush
>|しますので...
>|
>|  def max=(max)
>|    if @max <= max
>|      @max = max
>|    else
>|      Thread.critical = TRUE
>|      diff = max - @max
>|      @max = max
>|      diff.times do
>|	t = @queue_wait.shift
>|	t.run if t
>|      end
>       Thread.critical = FALSE
>|    end
>|  end
>
>
>Thread.critical = FALSEが必要ですね.

それに, 最初の条件判断が逆だったのと, @maxを最後に返していませんでした.

  def max=(max)
    if @max >= max
      @max = max
    else
      Thread.critical = TRUE
      diff = max - @max
      @max = max
      diff.times do
	t = @queue_wait.shift
	t.run if t
      end
      Thread.critical = FALSE
      @max
    end
  end

でも, 実際に実行してみると, @queue_waitで待っている順にpushしないとい
う問題がありました. t.runを同時に行なうので, この順番が狂う問題はどう
しようもないんですかね(?_?

__
................................石塚 圭樹@日本ラショナルソフトェア...
----------------------------------->> e-mail: keiju / rational.com <<---