小弟虽然写了挺久代码,但是多线程一直未涉及,总觉得很神秘。现在自学 ruby 写了一个数据分析的程序,因为数据需要不断重复循环搜索和总结,所以想着正好试着用上多线程。 于是就遇到基础问题了,首先是变量共享问题,比如下列代码
for i in 1..10
arrThread = Array.new
for j in i * 10...i * 10 + 3
p "j = #{j}"
arrThread << Thread.new { k = j; p "k = #{k}"; p k;}
end
#hold the main thread
arrThread[-1].join
end
一开始我没有加入 k = j 这句,发现输出全是重复的,于是我意识到可能是变量 j 在 Thread.new 的时候已经变了的关系,所以我尝试在 block 里增加一个 k。可是结果任然存在重复的情况。。。为什么在各自 block 中的 k 也是共享的而不是每个 block 私有的?
第二个问题是这样的,同样,上代码
arrN = Array.new
rangeSize = 1..(iIndex/10).to_i
arrDataForSearch = arrayToCreate[0..iIndex - 1]
rangeSize.to_a.each do |v|
arrN.push(ColorHelper.findN(5 * v, arrDataForSearch, true))
t1 = Thread.new {arrN.push(ColorHelper.findN(5 * v - 4, arrDataForSearch, true))}
t2 = Thread.new {arrN.push(ColorHelper.findN(5 * v - 3, arrDataForSearch, true))}
t3 = Thread.new {arrN.push(ColorHelper.findN(5 * v - 2, arrDataForSearch, true))}
t4 = Thread.new {arrN.push(ColorHelper.findN(5 * v - 1, arrDataForSearch, true))}
end
这段代码中我希望将原本逐个进入 findN 方法的循环,在单次循环中开 4 个额外线程并行进入。findN 方法是对整个 arrDataForSearch 数组做遍历并且匹配查找,没有数据修改。 结果发现并行确实存在,可是效率上并没有提升。单线程走完基本上在 1 分 05 秒,而多线程发挥不稳定,有时在 1 分,绝大多数在 1 分 20 秒,反而慢了。。 所以感觉是自己对多线程的理解和思路上肯定有问题,特请赐教,谢谢!