在我看来,在 Ruby MRI 1.8.7 中写入文件是完全线程安全的。
示例 1 - 完美的结果:
File.open("test.txt", "a") { |f|
threads = []
1_000_000.times do |n|
threads << Thread.new do
f << "#{n}content\n"
end
end
threads.each { |t| t.join }
}
示例 2 - 完美的结果(但速度较慢):
threads = []
100_000.times do |n|
threads << Thread.new do
File.open("test2.txt", "a") { |f|
f << "#{n}content\n"
}
end
end
threads.each { |t| t.join }
所以,我无法重建我面临并发问题的场景,可以吗?
如果有人能向我解释为什么我仍然应该在这里使用 Mutex,我将不胜感激。
编辑:这是另一个更复杂的例子,它工作得很好并且没有显示并发问题:
def complicated(n)
n.to_s(36).to_a.pack("m").strip * 100
end
items = (1..100_000).to_a
threads = []
10_000.times do |thread|
threads << Thread.new do
while item = items.pop
sleep(rand(100) / 1000.0)
File.open("test3.txt", "a") { |f|
f << "#{item} --- #{complicated(item)}\n"
}
end
end
end
threads.each { |t| t.join }