【发布时间】:2012-10-25 07:58:27
【问题描述】:
我有以下代码 (from a Ruby tutorial):
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)应该做什么? -
它给线程一个终止的限制(以秒为单位)。如果我不调用它,ruby 将在程序结束时自动获取线程(因此无限
loop do将始终结束)。请参阅ruby-doc.org/core-1.9.3/Thread.html#method-i-join 了解更多信息 -
这很有趣。在 ruby 1.8 上,
difference始终为 0,并且计数的差异永远不会超过 1,但在 ruby 1.9 上,difference始终 == 0,但 count1 和 count2 彼此相距很远。
标签: ruby multithreading ruby-1.9