この投稿によるとi += 1
、プリエンプションは関数呼び出しの最後でのみ発生し、間のどこかでは発生しないため、MRI Ruby ではスレッドセーフi += 1
です。
以下の繰り返し可能なテストは、これが正しいことを示しています。
しかし、while true do i += 1 end
以下の 2 番目のテストで示すように、スレッド 1 がまだ実行されているときにスレッド 1 がスレッド 2 によってプリエンプトされるのはなぜwhile true do i += 1 end
ですか?
助けてください。
以下はコードリファレンスです。
テスト 1:
100.times do
i = 0
1000.times.map do
Thread.new {1000.times {i += 1}}
end.each(&:join)
puts i
end
テスト 2:
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