2

この投稿によると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
4

1 に答える 1