2013-05-25 19 views
13

variabili locali definite al di fuori di un thread sembrano essere visibile dall'interno in modo che i seguenti due utilizzi di Thread.new sembrano essere la stessa:Quando è necessario passare argomenti a `Thread.new`?

a = :foo 
Thread.new{puts a} # => :foo 
Thread.new(a){|a| puts a} # => :foo 

Il document dà l'esempio:

arr = [] 
a, b, c = 1, 2, 3 
Thread.new(a,b,c){|d, e, f| arr << d << e << f}.join 
arr #=> [1, 2, 3] 

ma dal a, b, c sono visibili dall'interno del thread creato, questo dovrebbe essere lo stesso di:

arr = [] 
a, b, c = 1, 2, 3 
Thread.new{d, e, f = a, b, c; arr << d << e << f}.join 
arr #=> [1, 2, 3] 

C'è qualche differenza? Quando è necessario passare variabili locali come argomenti a Thread.new?

risposta

15

Quando si passa una variabile in un filo così, allora il thread fa una copia locale della variabile e lo utilizza, quindi le modifiche ad esso non influenzano la variabile al di fuori del filo che avete passato in

a = "foo" 
Thread.new{ a = "new"} 
p a # => "new" 
Thread.new(a){|d| d = "old"} 
p a # => "new" 
p d # => undefined 
+0

Buona risposta. Al punto. – sawa

+0

Se stiamo sovrascrivendo il valore di 'd' all'interno del thread, allora qual è il caso d'uso per passarlo come argomento? E se stiamo eseguendo qualsiasi operazione su 'd', allora sta riflettendo nel valore di' a'. '' ' a =" foo " Thread.new {a =" nuovo "} p a Thread.new (a) do | d | d.prepend ("vecchio") puts d # => "oldnew" mette un # => "oldnew" fine '' ' – Kuldeep

Problemi correlati