quabbinの日記: RubyのThread
前回の日記について、まつもとさん自身がblogで、private問題として
モジュールを気軽にincludeした時に、そのモジュールが定義しているpublicなメソッドが取り込まれることは問題ない。その機能(メソッドの集合)が欲しいからincludeするわけだから。
しかし、内部的に使われるだけのprivateなメソッドが重複してしまうことは避けたい。重複を避けるために妙なprefixを付けるのもイヤだし、とはいえ、気軽にprivateが使えないのもイヤだ。
と、問題視している。
親と子の間に干渉できないprivateがある欧州社会に対して、親子は干渉しあうのが当然という、少し古い日本的社会を表現しているのかと思いましたよ。
もうほぼ二年も前になる話ですが、これ、1.9.1では、なんらかの解決手段が提供されるのかしら?
さて、本題。
RubyのThreadについて、リファレンスを読んでいると時分割で優先順位付きと書いてあったわけだけど、どの程度優先順位が有効なのか量ってみた。
まず、量るために下のようなコードを作った
$share = []
A=0
B=0
def create_thread(priority, count, data)
t = Thread.start{
while $share.size < count
$share.push data
end
}
t.priority = priority
t
end
count = 100000
t1 = create_thread A, count, "a"
t2 = create_thread B, count, "b"
t1.join
t2.join
counter = Hash.new(0)
$share.each{|value|
counter[value] += 1
}
p counter
少し強引だ。
とりあえずAとBの値を調整しながら結果をまとめたところ、以下の表のようになった。
(実行環境は、AthronXP 1800+ / AcriveScriptRuby1.8 / Windows2000)
+-------------+-------------+---------+---------+
| A優先順位 | B優先順位 | A実行数 | B実行数 |
+-------------+-------------+---------+---------+
| 0 | 0 | 50058 | 49943 |
| 0 | 1 | 211 | 99789 |
| 0 | 10 | 211 | 99789 |
| 0 | 2147483647 | 211 | 99789 |
| 1 | 2 | 100000 | 0 |
| -2147483648 | 2147483647 | 70 | 99931 |
| 2147483647 | -2147483648 | 100000 | 0 |
+-------------+-------------+---------+---------+
どうやら、二つのスレッドの間における優先順位は、負数か0か1以上かの3値として考えられるものであり、1でも違っていれば実行数に大きな影響があるようだ。
これも心に留めながら、Rubyを使っていこう。
RubyのThread More ログイン