RubyMRI1.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を使うべきなのか誰かが私に説明してくれたら幸いです。
編集:これは、完全に正常に機能し、同時実行の問題を示さない、もう1つのより複雑な例です。
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 }