Ich habe den folgenden Code (from a Ruby tutorial):Loops in mehreren Threads
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}"
Es ein Beispiel ist Mutex.synchronize
für die Verwendung. Auf meinem Computer unterscheiden sich die Ergebnisse ziemlich vom Lernprogramm. Nach join
Aufruf sind die Zählungen manchmal gleich:
count1 : 5321211
count2 : 6812638
difference : 0
count1 : 27307724
count2 : 27307724
difference : 0
und manchmal nicht:
count1 : 4456390
count2 : 5981589
difference : 0
count1 : 25887977
count2 : 28204117
difference : 0
Ich verstehe nicht, wie es möglich ist, dass der Unterschied noch 0
ist, obwohl die Grafen sehr unterschiedlich zeigen Zahlen.
Der add
Betrieb sieht wohl so aus:
val = fetch_current(count1)
add 1 to val
store val back into count1
und etwas ähnliches für count2
. Ruby kann die Ausführung zwischen Threads wechseln, so dass es möglicherweise nicht fertig ist, in eine Variable zu schreiben, aber wenn die CPU zum Thread zurückkehrt, sollte sie von der Zeile weitergehen, in der sie unterbrochen wurde, richtig?
Und es gibt immer noch nur einen Thread, der in die Variable schreibt. Wie ist es möglich, dass innerhalb des loop do
Blocks count2 += 1
viel öfter ausgeführt wird?
was soll 'join (2)' tun? – uday
gibt es dem Thread ein Limit (in Sekunden) zu beenden. Wenn ich das nicht rufe, wird Ruby automatisch Threads ernten, wenn das Ende des Programms erreicht wird (also endet unendliche 'loop do' immer). siehe http://www.ruby-doc.org/core-1.9.3/Thread.html#method-i-join für weitere Informationen – Tombart
Das ist interessant. Bei Ruby 1.8 ist die "Differenz" immer <> 0 und die Anzahl unterscheidet sich nie um mehr als 1, aber bei Ruby 1.9 ist die "Differenz" immer == 0 aber count1 und count2 sind weit voneinander entfernt. – Casper