鉴于此剪裁:

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作为局部变量(具有词法作用域)传递,而应将其作为块变量传递。

下面的代码将打印一次从06的数字,尽管不能保证顺序。

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循环执行两次迭代所花费的时间。

10-01 18:48