根据这篇文章,i += 1
在 MRI Ruby 中是线程安全的,因为抢占只发生在函数调用结束时,而不是介于i += 1
.
但是为什么while true do i += 1 end
不是线程安全的,如下面的第二个测试所示,当线程 1 仍在执行时,线程 1 被线程 2 抢占了while true do i += 1 end
?
请帮忙。
以下是代码参考:
测试一:
100.times do
i = 0
1000.times.map do
Thread.new {1000.times {i += 1}}
end.each(&:join)
puts i
end
测试二:
t1 = Thread.new do
puts "#{Time.new} t1 running"
i = 0
while true do i += 1 end
end
sleep 4
t2 = Thread.new do
puts "#{Time.new} t2 running"
end
t1.join
t2.join