From: matz@... (Yukihiro Matsumoto) Date: 2000-09-26T16:38:26+09:00 Subject: [ruby-list:25178] Re: priority & ThreadGroup (Re: [ruby-dev:9438] Re: $SAFE) まつもと ゆきひろです In message "[ruby-list:25169] priority & ThreadGroup (Re: [ruby-dev:9438] Re: $SAFE)" on 00/09/26, Masatoshi SEKI writes: |> |servlet, applet, agent 関係で寿命が制御できる Thread が |> |欲しいなと思って、まあそれは timeout なりでできるんですが、 |> |Threadが新しいThreadを起動するともう制御できなくなりそう。 |> |> Ruby 1.5ではスレッドのpriorityとThreadGroupによってその問題 |> に対処しようとしています。つまり、agentなスレッドのプライオ |> リティを下げたり、スレッドグループ全体をkillしたりしようと言 |> うわけです。 | |eval.c を見ながらちょっと実験してみました。 | |= priority | | * メインスレッドのpriorityは 0 である。 | * スレッドを生成したスレッドのpriorityを引き継ぐ | * priorityはint。負も使える。 | * runnableなスレッドのうち、最も大きな priority を持つスレッドが | スケジューリングされる。 | → priorityの数値が大きいほど優先的にスケジューリングされる。 | * safe_level が 4 のスレッドからは priority を参照、変更できない。 | | |= ThreadGroup | | * スレッドにグループIDが増えた | * ThreadGroup.new すると新しいグループIDができる。 | * ThreadGroup#add(thread) すると thread のグループIDを変更できる | * スレッドは一度にただ一つのグループIDに属す。複数のグループに関連しない。 | * ThreadGroup#list すると生きているスレッドのうち、グループIDに | 関連するスレッドの配列が返る。 | * safe_level が 4 のスレッドからは ThreadGroup#add できない。 | |あっているでしょうか ? あってます。ただし、priorityの実装は手抜きなので、いつかはちゃ んとした優先順位付きスケジューラを実装せねばならんだろうと考 えてます。 |それから、以下は実験に使ったスクリプトの一部なのですが、 |コメントアウトされている Thread.current.priority = 1 を |入れると、スクリプトが終りません。バグ?? バグです。main threadの優先順位が高いと終了したスレッドの後 始末ができずブロックしてしまってました。 まつもと ゆきひろ /:|)