你什么时候需要将参数传递给`Thread.new`?
在线程外部定义的局部变量似乎从内部可见,因此Thread.new
的以下两个用法看起来是相同的:
a = :foo Thread.new{puts a} # => :foo Thread.new(a){|a| puts a} # => :foo
该文件给出了一个例子:
arr = [] a, b, c = 1, 2, 3 Thread.new(a,b,c){|d, e, f| arr << d << e < [1, 2, 3]
但由于a
, b
, c
在创建的线程内部是可见的,因此它也应该与:
arr = [] a, b, c = 1, 2, 3 Thread.new{d, e, f = a, b, c; arr << d << e < [1, 2, 3]
有什么区别吗? 什么时候需要将局部变量作为参数传递给Thread.new
?
当您将变量传递给类似的线程时,该线程会生成变量的本地副本并使用它,因此对它的修改不会影响您传入的线程之外的变量
a = "foo" Thread.new{ a = "new"} pa # => "new" Thread.new(a){|d| d = "old"} pa # => "new" pd # => undefined