Ho il codice seguente (from a Ruby tutorial):loop in più thread
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}"
È un esempio di uso Mutex.synchronize
. Sul mio computer, i risultati sono molto diversi dal tutorial. Dopo aver chiamato join
, i conti sono a volte uguali:
count1 : 5321211
count2 : 6812638
difference : 0
count1 : 27307724
count2 : 27307724
difference : 0
ea volte no:
count1 : 4456390
count2 : 5981589
difference : 0
count1 : 25887977
count2 : 28204117
difference : 0
Non capisco come sia possibile che la differenza è ancora 0
anche se i conteggi mostrano molto diversa numeri.
L'operazione add
probabilmente simile a questa:
val = fetch_current(count1)
add 1 to val
store val back into count1
e qualcosa di simile per count2
. Ruby può cambiare l'esecuzione tra i thread, quindi potrebbe non finire di scrivere su una variabile, ma quando la CPU torna al thread, dovrebbe continuare dalla riga in cui è stata interrotta, giusto?
E c'è ancora solo un thread che sta scrivendo nella variabile. Com'è possibile che, all'interno del blocco loop do
, count2 += 1
venga eseguito molte più volte?
cosa dovrebbe fare 'join (2)'? – uday
fornisce al thread un limite (in secondi) per terminare. se non lo chiamo, ruby raccoglierà automaticamente i thread quando raggiungerà la fine del programma (così finirà sempre l'infinito 'loop do'). vedi http://www.ruby-doc.org/core-1.9.3/Thread.html#method-i-join per maggiori informazioni – Tombart
Questo è interessante. Su ruby 1.8 la 'difference' è sempre <> 0, ei conteggi non differiscono mai di più di 1, ma su ruby 1.9 la' difference' è sempre == 0 ma count1 e count2 sono molto distanti l'uno dall'altro. – Casper