次のコードがあります(Rubyチュートリアルから):
require 'thread'
count1 = count2 = 0
difference = 0
counter = Thread.new do
loop do
count1 += 1
count2 += 1
end
end
spy = Thread.new do
loop do
difference += (count1 - count2).abs
end
end
sleep 1
puts "count1 : #{count1}"
puts "count2 : #{count2}"
puts "difference : #{difference}"
counter.join(2)
spy.join(2)
puts "count1 : #{count1}"
puts "count2 : #{count2}"
puts "difference : #{difference}"
の使用例ですMutex.synchronize
。私のコンピューターでは、結果はチュートリアルとはかなり異なります。を呼び出した後join
、カウントが等しい場合があります。
count1 : 5321211
count2 : 6812638
difference : 0
count1 : 27307724
count2 : 27307724
difference : 0
時にはそうではありません:
count1 : 4456390
count2 : 5981589
difference : 0
count1 : 25887977
count2 : 28204117
difference : 0
0
カウントが非常に異なる数値を示しているにもかかわらず、違いがまだ残っている可能性があることを理解していません。
操作はおそらく次のadd
ようになります。
val = fetch_current(count1)
add 1 to val
store val back into count1
と似たようなものですcount2
。Rubyはスレッド間で実行を切り替えることができるので、変数への書き込みが終わらないかもしれませんが、CPUがスレッドに戻ると、中断された行から続行するはずですよね?
そして、変数に書き込みを行っているスレッドはまだ 1 つだけです。loop do
ブロック内で、count2 += 1
より多くの回数が実行される可能性はありますか?