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

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

>まつもと ゆきひろです

>スレッド周りは私も分かんないことが多いんです.

(^^;;;

>|SizedQueueで途中で max size が帰られると良いと思ったんですが...
>
>んーと,石塚さんの定義ではまずいように思います.そもそもmax
>を大きくする方はともかく,maxを小さくする時の挙動って定義で
>きないような気が….

小さくする時は, @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
    end
  end

>|一応, ``#-->Thread.critical = TRUE'' があった方がよかないですか? 
>
>なくても良いような気がするんですけどねえ.あっても邪魔になら
>ないんで追加しておきますか.

SizedQueue#pushは, @que.size == @max - 1の時に, 同時に複数スレッドから
pushしたときとかは, 2つpushできてしまいますので... SizeQueue#popは動き
出すべきスレッドが動かなくなる可能性がありますものね... 

対したことではないといえば対したことでもないんですが...

>|  back, Thread.critical = Thread.critical, TRUE
>|  Thread.critical = back
>|
>|の組合せの方が良くないですか? それとも, そういう必要はないんですかね?
>
>Thread.criticalはネストすることはないはず(というかそうするべ
>き)なので,現状で良いと思います.

なるほど. 了解しました. そうすると, SizedQueueのようにサブクラスを作っ
たりする時は気をつけないといけないですね.

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