From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?= ) Date: 1998-02-26T14:18:21+09:00 Subject: [ruby-dev:1543] Re: SizedQueue and some question けいじゅ@日本ラショナルソフトウェアです. In [ruby-dev :01531 ] the message: "[ruby-dev:1531] Re: SizedQueue and some question ", on Feb/25 12:32(JST) Yukihiro Matsumoto writes: >まつもと ゆきひろです >|っていみですよね? そうすると, t.run したじゅんばんに @que.pushすること >|になるんです? > >Thread.criticalでない場合はrunするとそのままそのスレッドに実 >行権が移りますから,t.runした順番になる可能性が高いと思いま >すけど. ? そうすると, Thread.critical = TRUE の時はどうなるの? その変はなんか 同じじゃないんですか? と思っていたら下に答がありますね... # いままで, わかっていなくて作っていたのかな(^^;;;; >|とするってのはどうですか? そうすると, 走り出したスレッドが他のスレッド >|をブロックするので順序が保証されるんじゃないですかね? >Thread.criticalな状態でrunされた場合は,スレッドの状態が >runnableになるだけで,次に実行権が渡る順番は不定です.ですか >ら,順序の保証にはならないと思います.そもそも走り出す順番が >不定なんですから. うーん. そうだったんですね. 全然知らなかった(^^;;;;;;;;;;;; # Thread.criticalな状態でも, t.runするとそれが解除されると信じていまし # た(^^;;; そうすると. 例えば SizedQueue:: def pop(*args) Thread.critical = TRUE if @que.length < @max t = @queue_wait.shift #1-> t.run if t end pop = super pop end Queue:: def pop non_block=FALSE item = nil until item Thread.critical = TRUE if @que.length == 0 if non_block $2-> Thread.critical = FALSE raise ThreadError, "queue empty" end @waiting.push Thread.current #3-> Thread.stop else item = @que.shift end end #4->Thread.critical = FALSE item end なんかでは, #1では実際にスレッドは走りはじめないんですね? んで, #3でカレントのスレッ ドが停止した時か#2, #4で走りはじめることになる? >| def push(obj) >| Thread.critical = TRUE >| while @que.length >= @max >| @queue_wait.push Thread.current >| Thread.stop >|--> Thread.critical = TRUE >| end >| super >| end >これはこれで別の意味はあると思うんですが. そうですね. 最初にするなら, ここでもしないと... 今回の理解を元に書き換えました. 以下のはどうです? SizedQueue:: def max=(max) Thread.critical = TRUE if @max >= max @max = max Thread.critical = FALSE else diff = max - @max @max = max Thread.critical = FALSE diff.times do t = @queue_wait.shift t.run if t end end max end それなりに利用価値があるともうので, できればSizedQueueに採用して下さい. __ ................................石塚 圭樹@日本ラショナルソフトェア... ----------------------------------->> e-mail: keiju@rational.com <<---