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

In [ruby-dev :01525 ] the message: "[ruby-dev:1525] Re: SizedQueue and
some question ", on Feb/24 18:15(JST) Yukihiro Matsumoto writes:

>まつもと ゆきひろです

>|でも, 実際に実行してみると, @queue_waitで待っている順にpushしないとい
>|う問題がありました. t.runを同時に行なうので, この順番が狂う問題はどう
>|しようもないんですかね(?_?
>
>いっそのこと Thread.critical を触らなければ良いんじゃないで
>すかね.多分問題ないでしょう(本当か?).

ん? ほんとにそういう問題なんですか?

  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

っていみですよね? そうすると, t.run したじゅんばんに @que.pushすること
になるんです?

それよか,

  def push(obj)
    Thread.critical = TRUE
    while @que.length >= @max
      @queue_wait.push Thread.current
      Thread.stop
-->   Thread.critical = TRUE
    end
    super
  end

とするってのはどうですか? そうすると, 走り出したスレッドが他のスレッド
をブロックするので順序が保証されるんじゃないですかね?

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