【发布时间】:2014-05-05 15:39:08
【问题描述】:
我很好奇 Ruby 中哈希的线程安全性。从控制台运行以下命令(Ruby 2.0.0-p247):
h = {}
10.times { Thread.start { 100000.times {h[0] ||= 0; h[0] += 1;} } }
返回
{0=>1000000}
这是正确的预期值。
为什么有效?在这个版本的 Ruby 中,我可以依赖哈希是线程安全的吗?
编辑:测试 100 次:
counter = 0
100.times do
h={}
threads = Array.new(10) { Thread.new { 10000.times { h[0] ||= 0; h[0] += 1 } } }
threads.map { |thread| thread.join }
counter += 1 if h[0] != 100000
end
puts counter
计数器最后仍然为 0。我尝试了多达 10K 次,并且这段代码从未遇到过单个线程安全问题。
【问题讨论】:
标签: ruby multithreading thread-safety hashmap