[#1381] bound method — shugo@... (Shugo Maeda)

前田です。

21 messages 1998/02/04
[#1383] Re: bound method — matz@... (Yukihiro Matsumoto) 1998/02/05

まつもと ゆきひろです

[#1384] Re: bound method — keiju@... (石塚圭樹 ) 1998/02/05

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

[#1385] Re: bound method — matz@... (Yukihiro Matsumoto) 1998/02/05

まつもと ゆきひろです

[#1387] Re: bound method — keiju@... (石塚圭樹 ) 1998/02/05

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

[#1388] Re: bound method — matz@... (Yukihiro Matsumoto) 1998/02/05

まつもと ゆきひろです

[#1389] Re: bound method — keiju@... (石塚圭樹 ) 1998/02/05

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

[#1396] Re: bound method — matz@... (Yukihiro Matsumoto) 1998/02/06

まつもと ゆきひろです

[#1410] GD — Masao Kanemitsu <masao-k@...>

30 messages 1998/02/10
[#1411] Re: GD — matz@... (Yukihiro Matsumoto) 1998/02/10

まつもと ゆきひろです

[#1413] Re: GD — WATANABE Hirofumi <watanabe@...> 1998/02/10

わたなべです.

[#1417] Re: GD — Masao Kanemitsu <masao-k@...> 1998/02/10

<199802100623.PAA03533@eban.ase.ptg.sony.co.jp> の、

[#1420] Re: GD — WATANABE Hirofumi <watanabe@...> 1998/02/10

わたなべです.

[#1426] Re: GD — Masao Kanemitsu <masao-k@...> 1998/02/10

<199802100733.QAA04028@eban.ase.ptg.sony.co.jp> の、

[#1428] Re: GD — WATANABE Hirofumi <watanabe@...> 1998/02/10

わたなべです.

[#1429] Re: GD — Masao Kanemitsu <masao-k@...> 1998/02/10

<199802100757.QAA04212@eban.ase.ptg.sony.co.jp> の、

[#1431] Re: GD — WATANABE Hirofumi <watanabe@...> 1998/02/10

わたなべです.

[#1434] Re: GD — Masao Kanemitsu <masao-k@...> 1998/02/12

<199802100952.SAA04346@eban.ase.ptg.sony.co.jp> の、

[#1435] Re: GD — WATANABE Hirofumi <watanabe@...> 1998/02/12

わたなべです.

[#1436] Re: GD — Masao Kanemitsu <masao-k@...> 1998/02/12

<199802120449.NAA00398@eban.ase.ptg.sony.co.jp> の、

[ruby-dev:1543] Re: SizedQueue and some question

From: keiju@... (石塚圭樹 )
Date: 1998-02-26 05:18:21 UTC
List: ruby-dev #1543
けいじゅ@日本ラショナルソフトウェアです.

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 <<---

In This Thread