1時間くらいしかやってないのでひょっとしたら全然ミスってるかもしれないのですが、RubyのThreadはインターフェースはJavaっぽくて分かりやすい感じなのだけど、実際はつかえねーだす。今日やりたかったのはデータベースへのアクセスを並列化する事なんだけど・・・
result = 0
threads = []
hosts = [ ... ]
hosts.each { |h|
threads.push (
Thread.start {
s = Mysql::connect(h);
res = s.query("SELECT COUNT(*) FROM ...")
result += res.fetch_row[0].to_i
}
)
}
threads.each { |t| t.join }
ってコードで、当たり前だけどMutexをこれにつけないといけない。スレッドで共有しているのはresultなので、これを守ってやればいいのかな、と
m = Mutex.new
result = 0
threads = []
hosts = [ ... ]
hosts.each { |h|
threads.push (
Thread.start {
s = Mysql::connect(h);
res = s.query("SELECT COUNT(*) FROM ...")
m.synchronize {
result += res.fetch_row[0].to_i
}
}
)
}
threads.each { |t| t.join }
ところがこれがうまくいかない。resultの値がめちゃくちゃですよ。色々やってみたのだけど、結局うまく行くのは、Threadの中身全体をm.synchronizeしたときだけ・・・ってこれじゃあ結局順番に行うだけだから意味ないじゃん!
FAQをよく見てみると
がーん。というわけで結局Cで書くしかなさそうだ。