我有以下代碼(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)'應該做什麼? – uday
它給線程一個限制(以秒爲單位)終止。如果我不會調用它,ruby會在程序結束時自動收集線程(所以無限循環會永遠結束)。請參閱http://www.ruby-doc.org/core-1.9.3/Thread.html#method-i-join瞭解更多信息 – Tombart
這很有趣。在ruby 1.8上,'difference'總是<> 0,並且計數永遠不會超過1,但在ruby 1.9上,'difference'總是== 0,但是count1和count2彼此相距很遠。 – Casper