まつもと ゆきひろです

In message "[ruby-list:25169] priority & ThreadGroup (Re: [ruby-dev:9438] Re: $SAFE)"
    on 00/09/26, Masatoshi SEKI <m_seki / mva.biglobe.ne.jp> 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の優先順位が高いと終了したスレッドの後
始末ができずブロックしてしまってました。

                                まつもと ゆきひろ /:|)