鉴于此剪裁:
thr = []
for n in 0..6 do
thr[n] = Thread.new {
print n
}
end
for n in 0..6 do
thr[n].join
end
我期望的是:
0123456
我得到的是:2220000
目标是创建线程数组,并等待它们完成。显然,我缺乏对 ruby 线程的理解。
我该如何解决?
最佳答案
不要将n
作为局部变量(具有词法作用域)传递,而应将其作为块变量传递。
下面的代码将打印一次从0
到6
的数字,尽管不能保证顺序。
thr = []
for n in 0..6 do
thr[n] = Thread.new(n) {|n|
print n
}
end
for n in 0..6 do
thr[n].join
end
您的代码不起作用的原因是,块中的
n
引用了n
中定义的for n in 0..6
,它在块执行期间会发生变化。并非总是获得2220000
,但是在许多情况下,您会得到类似的结果。 2
开头的序列表明,Thread.new(n)
创建新线程并继续执行print n
所花费的时间大约等于for
循环执行两次迭代所花费的时间。