我有以下代码(来自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返回到线程时,应该从被中断的那一行继续执行,对吗?
仍然只有一个线程正在向变量中写入。在loop do
块内,为什么count2 += 1
会被执行更多次?
join(2)
应该做什么? - udayloop do
也将有个终结)。请参见 http://www.ruby-doc.org/core-1.9.3/Thread.html#method-i-join 了解更多信息。 - Tombart