From: Masatoshi SEKI Date: 2000-09-26T01:32:08+09:00 Subject: [ruby-list:25169] priority & ThreadGroup (Re: [ruby-dev:9438] Re: $SAFE) 咳といいます。 古い話題ですが 1.6 がでたので ruby-list に持ってきました。 元は [ruby-dev:9438] です。 > |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 できない。 あっているでしょうか ? それから、以下は実験に使ったスクリプトの一部なのですが、 コメントアウトされている Thread.current.priority = 1 を 入れると、スクリプトが終りません。バグ?? ruby は ruby 1.6.1 (2000-09-25) [i586-linux] です。 CVSからもってきたものです。 ---- t.rb ---- class Foo def initialize(name) @name = name end attr_reader(:name) def run(pri) Thread.new do me = Thread.current me.priority = pri me['foo'] = @name sleep 1 for i in 0..1000 p [name, i] if i % 100 == 0 end self end end end grp = ThreadGroup.new for i in 0..5 f = Foo.new(i) grp.add(f.run(i)) end p grp.list sleep 1 # Thread.current.priority = 1 p grp.list